grep para ignorar padrões


12

Estou extraindo URLs de um site usando cURL como abaixo.

curl www.somesite.com | grep "<a href=.*title=" > new.txt

Meu arquivo new.txt é como abaixo.

<a href="http://website1.com" title="something">
<a href="http://website1.com" information="something" title="something">
<a href="http://website2.com" title="some_other_thing">
<a href="http://website2.com" information="something" title="something">
<a href="http://websitenotneeded.com" title="something NOTNEEDED">

No entanto, preciso extrair apenas as informações abaixo.

<a href="http://website1.com" title="something">
<a href="http://website2.com" information="something" title="something">

Estou tentando ignorar o <a hrefque tem informações neles e cujo título termina com NOTNEEDED .

Como posso modificar minha declaração grep?


A saída que você está mostrando aqui está correta? O texto que a descreve não faz sentido junto com este exemplo.
Slm

1
Você não está procurando curl www.somesite.com | grep "<a href=.*title=" | grep -v NOTNEEDED > new.txt?
terdon

@terdon, exatamente era o que eu estava procurando. Posso aceitá-lo como resposta se você publicá-lo.
Ramesh

Ramesh, é basicamente a resposta do @ slm. Acabei de editá-lo para que você possa aceitá-lo.
terdon

Ah, sim, eu não sabia que o cachimbo era tão poderoso. Eu aceitei como resposta. Obrigado!
Ramesh

Respostas:


16

Eu não estou seguindo totalmente o seu exemplo + a descrição, mas parece que o que você quer é este:

$ grep -v "<a href=.*title=.*NOTNEEDED" sample.txt 
<a href="http://website1.com" title="something">
<a href="http://website1.com" information="something" title="something">
<a href="http://website2.com" title="some_other_thing">
<a href="http://website2.com" information="something" title="something">

Então, para o seu exemplo:

$ curl www.example.com | grep -v "<a href=.*title=" | grep -v NOTNEEDED > new.txt

Eu tenho uma classe na seção <a href. Basicamente, eu não quero isso na minha saída.
Ramesh

9

A página do manual grep diz:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX .) 

Você pode usar expressões regulares para várias inversões:

grep -v 'red\|green\|blue'

ou

grep -v red | grep -v green | grep -v blue
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.