Verwijder regels in een tekstbestand die een specifieke string bevatten

Hoe zou ik sed gebruiken om alle regels in een tekstbestand te verwijderen die een specifieke string bevatten?

Oplossing

Om de regel te verwijderen en de uitvoer naar standaard uit te printen:

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

Om het bestand direct te wijzigen - werkt niet met BSD sed:

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

Idem, maar voor BSD sed (Mac OS X en FreeBSD) - werkt niet met GNU sed:

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

Om het bestand direct te wijzigen (en een backup te maken) - werkt met BSD en GNU sed:

sed -i.bak '/pattern to match/d' ./infile
Commentaren (25)

Er zijn vele andere manieren om regels met een specifieke string te verwijderen dan 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 en later)

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

GNU grep

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

En natuurlijk sed (het afdrukken van het inverse is sneller dan het daadwerkelijke wissen):

sed -n '/pattern/!p' file
Commentaren (7)

Je kunt sed gebruiken om regels op hun plaats in een bestand te vervangen. Het lijkt echter veel langzamer te zijn dan grep te gebruiken voor het omgekeerde in een tweede bestand en dan het tweede bestand over het origineel te schuiven.

bijv.

sed -i '/pattern/d' filename      

of

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

Het eerste commando duurt toch 3 keer langer op mijn machine.

Commentaren (9)