Slet linjer i en tekstfil, der indeholder en bestemt streng

Hvordan kan jeg bruge sed til at slette alle linjer i en tekstfil, der indeholder en bestemt streng?

Løsning

Sådan fjerner du linjen og udskriver output til standard out:

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

For at ændre filen direkte - virker ikke med BSD sed:

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

Det samme, men for BSD sed (Mac OS X og FreeBSD) - virker ikke med GNU sed:

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

For at ændre filen direkte (og oprette en sikkerhedskopi) - virker med BSD og GNU sed:

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

Der er mange andre måder at slette linjer med en specifik streng på end 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 og senere)

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

GNU grep

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

Og selvfølgelig sed (det er hurtigere at udskrive det omvendte end faktisk sletning):

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

Du kan bruge sed til at erstatte linjer på stedet i en fil. Det ser dog ud til at være meget langsommere end at bruge grep til den omvendte del i en anden fil og derefter flytte den anden fil over den oprindelige.

f.eks.

sed -i '/pattern/d' filename      

eller

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

Den første kommando tager alligevel 3 gange længere tid på min maskine.

Kommentarer (9)