Como posso remover linhas que combinam foo mas não combinam bar?

2

Suponha que eu queira remover a 2ª e a 3ª, mas não a 4ª linha do arquivo a seguir (aquelas que correspondem a foo, mas não coincidem com a barra), posso facilmente fazer isso com, por exemplo, sed?

text
foo some more text
even more foo text
some foo text with bar
    
por quazgar 27.10.2014 / 10:22

2 respostas

4

Várias alternativas:

awk '! (/foo/ && !/bar/)'
awk '/bar/ || !/foo/'
sed -e /bar/b -e /foo/d
sed '/foo/{/bar/!d;}'
perl -ne 'print unless /foo/ && !/bar/'

GNU grep com suporte a PCRE:

grep -vP '^(?!.*bar).*foo'

(usando o operador look-ahead negativo da PCRE (?!...) ).

Desses, apenas perl permite a edição no local de forma portável (em sistemas nos quais qualquer versão de perl esteja instalada) com a opção -i .

O padrão sed não faz edição no local. No entanto, o sed de alguns BSDs recentes permite isso com a opção -i '' e o GNU sed com -i (ambos modelados após perl ) como uma extensão.

Versões muito recentes do GNU awk também permitem isso com -i inplace .

    
por 27.10.2014 / 12:47
5

Parece funcionar para mim assim:

sed '/foo/{/bar/!d;}' my_file
    
por 27.10.2014 / 10:22