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/: substituafooporbar. -
.*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$0pela 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 substituindofoopor '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]).*//' )