Use grep
grep -Po '(?<=789).{4}'
Explicação
-
grep -P
: use grep no modo Perl -
-o
: apenas retorna a parte correspondente -
(?<=789)
: lookbehind. Isso deve vir antes da parte "correspondente". -
.{4}
: corresponde a quatro caracteres (após o lookbehind). Isso é o que será retornado.
Ou use sed
sed -r 's/.*789(.{4}).*//'
Isso pressupõe que há apenas um 789
na linha.
Explicação
-
sed -r
: use o sed no modo de expressão regular estendida para melhor legibilidade. -
s/foo/bar/
: substituafoo
porbar
. -
.*789(.{4}).*
: corresponde ao início da linha.*
,789
, depois quatro caracteres(.{4})
, enquanto os captura com()
, depois o restante da linha.*
. Isso corresponde a linha inteira no total. -
: substitua a linha inteira pelo primeiro padrão correspondente de cima.
Ou use o awk
awk '{if (match($0,/789(.{4})/,m)) print m[1]}'
Isso pressupõe que há apenas um 789
na linha. Há provavelmente meia dúzia de maneiras de fazer isso no awk.
Explicação
-
match($0,/789(.{4})/,m)
: procure na linha inteira$0
pela regex789(.{4})
e capture os quatro caracteres após789
. -
print m[1]
: imprima o primeiro grupo de captura.
Apenas dígitos
Se você quiser apenas pegar dígitos, pode usar algo como o seguinte:
grep -Po '(?<=789).*' | sed -r 's/^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*//'
Note que esta estratégia presume que são quatro dígitos após 789
.
Explicação
-
grep -Po '(?<=789).*'
: semelhante ao acima, mas imprime todos caracteres após789
. -
| sed -r 's/foo/bar/'
: canaliza para sed usando o modo de expressão regular estendida e substituindofoo
por 'bar. -
^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*
: corresponde ao início da linha^
, todos os caracteres não dígitos[^0-9]*
e, em seguida, captura o dígito([0-9])
. Repita isso mais três vezes e combine o restante da linha.*
. -
: substitua a linha inteira pelos grupos de captura, ou seja, os próximos quatro dígitos.
(Alternativamente, você pode simplificar a expressão sed usando o regex não-ganancioso do perl. perl -pe 's/.*?([0-9]).*?([0-9]).*?([0-9]).*?([0-9]).*//'
)