Estender grep para encontrar um jogo após o primeiro jogo

3

Eu tenho uma longa lista de strings separadas por novas linhas e cada seção separada por uma string começando com ~ (não há outros ~ no arquivo). Desejo estender o grep para encontrar o texto ~ logo abaixo da correspondência.

Entrada:

abc
ads
acb
abc
acsa
acfs
~notthis
abc
ads
acb
xyz                <-- pattern
acsa
acfs
~this              <-- output
abc
ads
acb
abc
acsa
acfs
~no

Saída ao pesquisar por xyz :

~ this

Com awk eu faria algo como

awk '/xyz/{x=1}x&&/~/{print;exit}' file

mas eu quero usar o grep se ele puder me dar uma vantagem de desempenho

    
por confused00 29.10.2014 / 11:20

1 resposta

3

Pelo menos com GNU grep 2.12 :

$ grep -Pzo 'xyz(?:.*\n)*?\K~this' file
~this

Se a sua versão grep não permitir -P com -z , você pode usar pcregrep em vez disso:

$ pcregrep -Mo 'xyz(?:.*\n)*?\K~this' file
~this
    
por 29.10.2014 / 11:28