Eliminar linhas em um arquivo de texto que contenham uma string específica

Como eu usaria sed para excluir todas as linhas em um arquivo de texto que contenham uma string específica?

Solução

Para remover a linha e imprimir a saída de forma padrão:

sed '/pattern to match/d' ./infile

Para modificar diretamente o arquivo - não funciona com BSD sed:

sed -i '/pattern to match/d' ./infile

O mesmo, mas para o BSD sed (Mac OS X e FreeBSD) - não funciona com o GNU sed:

sed -i '' '/pattern to match/d' ./infile

Para modificar diretamente o arquivo (e criar um backup) - funciona com BSD e GNU sed:

sed -i.bak '/pattern to match/d' ./infile
Comentários (25)

Existem muitas outras maneiras de apagar linhas com string específica além de `sed':

AWK

awk '!/pattern/' file > temp && mv temp file

Ruby (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash 3.2 e posteriores)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done  o
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

E, claro, sed (imprimir o inverso é mais rápido do que a eliminação real):

sed -n '/pattern/!p' file
Comentários (7)

Você pode usar sed para substituir as linhas no lugar em um arquivo. No entanto, parece ser muito mais lento do que usar o grep para o inverso num segundo ficheiro e depois mover o segundo ficheiro sobre o original.

por exemplo

sed -i '/pattern/d' filename      

ou

grep -v "pattern" filename > filename2; mv filename2 filename

O primeiro comando demora 3 vezes mais na minha máquina de qualquer maneira.

Comentários (9)