Procurando arquivo por string cercado por duas outras strings conhecidas?

1

O título da pergunta pode ser meio vago, mas aqui está o que estou tentando fazer.

Eu tenho um arquivo html localmente no meu servidor, que está mudando regularmente. Tem várias ocorrências de:

<p>Jumble of random text</p>
<p>More text</p>

E assim por diante ...

Eu quero ser capaz de classificar todos os diferentes tipos de texto aleatório até encontrar o que estou procurando, por exemplo, 'aleatório', que poderia estar em qualquer lugar do arquivo. Então eu quero uma variável atribuída a

Jumble of random text

Tudo entre o:

<p> and </p>

Até agora eu tenho isso:

echo grep -i 'random' search.html | grep -o -P '(?<=<p>).*(?=</p>)' search.html

O que funciona até certo ponto, no entanto, é encontrar a primeira ocorrência e a última ocorrência das tags de parágrafo, portanto, me dando uma saída enorme de dados sem sentido, ou seja, neste caso:

Jumble of random text
More text

Como posso fazer isso apenas retornar:

Jumble of random text

Ficando muito confuso, muito rápido.

    
por James Hiey 08.03.2015 / 10:09

1 resposta

1

Isso ocorre porque o padrão de correspondência .* é o que é conhecido como correspondência desejada , o que significa que ele retornará a sequência maior para corresponder ao seu padrão de pesquisa. / p>

O que você gostaria de fazer é usar uma correspondência não voraz (ou preguiçoso ), que retorna a string menor para corresponder seu padrão. Você pode fazer isso alterando sua correspondência desejada de .* para .*? . No entanto, grep normalmente não suporta isso por padrão, mas você pode habilitar isso usando a opção -P que permite a correspondência de expressão regular perl.

Em suma, você pode alterar seu comando grep para grep -o -P '(?<=<p>).*?(?=</p>)' .

Mais detalhes sobre essa resposta podem ser encontrados no link

    
por 08.03.2015 / 12:04