Hoe zou ik sed gebruiken om alle regels in een tekstbestand te verwijderen die een specifieke string bevatten?
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
Er zijn vele andere manieren om regels met een specifieke string te verwijderen dan 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
En natuurlijk sed
(het afdrukken van het inverse is sneller dan het daadwerkelijke wissen):
sed -n '/pattern/!p' file
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.