Padrão de regex com grep para expressão2 DEPOIS da expressão1

0

Estou tentando descobrir qual dos vários arquivos HTML tem um título com a palavra Agente com o nome de um determinado agente em qualquer lugar depois desse título.

Então, tipicamente algo como

<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

deve ser encontrado

Mas eu não posso garantir qualquer regularidade na marcação ou no conteúdo entre o cabeçalho e a instância da XYZ Corp. Então, em algo como o DOS, eu poderia procurar por 'Agente * XYZ' significando

-match the string 'Agent'
-followed by anything
-followed by the string 'XYZ'

Como escrevo isso no grep no Ubuntu? Eu tentei

grep -lc 'Agent*XYZ' *.html
grep -lc 'Agent.*?XYZ' *.html

ambos sem sucesso. Eu posso encontrar o padrão manualmente em mais de um dos arquivos, então eu sei que existe.

TIA

    
por Feargal Hogan 31.01.2017 / 13:21

2 respostas

0

Algo assim parece bom para o seu alvo:

$ cat d2.txt
<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

$ grep -i 'agent' d2.txt #-i = ignore case. By default grep returns lines containing agent followed by anything or even alone
<h3>Agent</h3>
<p>Their agent is XYZ Corp.</p>

$ grep -iE 'agent.*XYZ' d2.txt #match agent followed by XYZ
<p>Their agent is XYZ Corp.</p>
    
por 31.01.2017 / 14:19
0

Assumindo que o cabeçalho h3 sempre ocorra em uma linha separada do nome do agente, sed parece ser capaz de fazer o que você pede.

Dado o arquivo de entrada

some data
at the top
<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>
some data
at the bottom

o comando

sed -n '\#<h3>Agent</h3>#,/XYZ/p' input.html

irá gerar

<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

O comando sed produzirá qualquer coisa entre as linhas correspondentes às duas expressões regulares <h3>Agent</h3> e XYZ (inclusive). O funky olhando \#...# que está delimitando a primeira expressão regular é apenas como usar um delimitador personalizado. Eu fiz dessa maneira, em vez de escapar do / no padrão.

    
por 31.01.2017 / 22:11