sed -n -e '/[A-Z][A-Z][A-Z]/p'
imprime as linhas que correspondem a essa expressão regular.
Aqui, você deseja:
sed -n 's/.*\([[:upper:]]\{3\}\).*//p'
Ou seja, você deseja substituir uma sequência de qualquer caractere (o maior número possível) seguido por 3 letras maiúsculas (capturadas em com
\(...\)
) seguidas por uma seqüência de caracteres com as letras capturadas e impressão o resultado dessa substituição se corresponder (o sinalizador p
do comando s
).
Note que apenas imprimirá um conjunto por linha (o mais à direita).
Para imprimir todos eles, você poderia fazer:
tr -cs '[:upper:]' '[\n*]' | grep -Ex '.{3}'
(observe que, com algumas implementações de tr
, ele não funciona corretamente com caracteres de múltiplos bytes).
A idéia é de tr analisar as s equações do c omplemento de letras de maiúsculas superiores para caracteres de nova linha , de modo que a saída de tr
contenha todas as seqüências de caracteres maiúsculos. Então você pode fazer um x ato grep
para os que você está interessado.
Em uma entrada como FOO BAR02 ABCDEF
, seria impresso:
FOO
BAR
Enquanto a solução anterior imprime DEF
. Se você tem o GNU grep
, você pode usar sua opção -o
:
grep -Eo '[[:upper:]]{3}'
Qual imprimiria:
FOO
BAR
ABC
DEF