Como eu usaria sed para excluir todas as linhas em um arquivo de texto que contenham uma string específica?
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
Existem muitas outras maneiras de apagar linhas com string específica além de `sed':
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
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
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.