Você pode usar o grep
e o recurso PCRE que ele fornece para fazer isso:
$ grep -Po "(?<=XXX )\S+(?= ZZZ)" data.txt
Y1Y
Y2Y
Detalhes
Esta solução utiliza o recurso lookbehind e lookahead do PCRE, que pode corresponder a cadeias de comprimento fixo.
O texto acima analisa cada \w+
para ver se é XXX
e a cabeça de cada \w+
, se é ZZZ
. Se for, então é um jogo. A alteração de -o
para grep
diz para imprimir apenas as correspondências, ou seja, \w+
.
Acompanhamento, você pode fazer isso com sed?
Eu não acho que esse problema possa ser resolvido usando sed
. Existem duas abordagens que eu vejo.
- salve possíveis correspondências em uma variável secundária, se encontrar ZZZ, imprima-as
- s / XXX .. nossa string .. ZZZ / .. nossa string ../
Não. Parece ser uma quantidade razoável de trabalho, então não vou nem tentar. Veja o que acontece com a abordagem nº 2.
$ sed 's/.*XXX \(.*\) ZZZ.*//' data.txt
Y1Y
Y2Y
AAAa YXX Y2Y ZZZ TT GGGG UU
Por isso, pode encontrar as correspondências muito bem, mas não faz nada para linhas que não correspondem. Pode haver uma maneira de instruir sed
para excluir essas linhas e, nesse caso, essa seria uma solução alternativa.