Odstránenie riadkov v textovom súbore, ktoré obsahujú určitý reťazec

Ako by som mohol použiť sed na odstránenie všetkých riadkov v textovom súbore, ktoré obsahujú určitý reťazec?

Riešenie

Odstránenie riadku a vytlačenie výstupu na štandardný výstup:

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

Priama úprava súboru - nefunguje s BSD sed:

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

To isté, ale pre BSD sed (Mac OS X a FreeBSD) - nefunguje s GNU sed:

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

Priama úprava súboru (a vytvorenie zálohy) - funguje s BSD a GNU sed:

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

Okrem sed existuje mnoho ďalších spôsobov, ako vymazať riadky so špecifickým reťazcom:

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 a novší)

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

GNU grep

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

A samozrejme sed (vypísanie inverzie je rýchlejšie ako skutočné vymazanie):

sed -n '/pattern/!p' file
Komentáre (7)

Na nahradenie riadkov na mieste v súbore môžete použiť sed. Zdá sa však, že je to oveľa pomalšie ako použitie grepu na inverziu do druhého súboru a následné presunutie druhého súboru nad pôvodný.

Napr.

sed -i '/pattern/d' filename      

alebo

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

Prvý príkaz trvá na mojom počítači aj tak trikrát dlhšie.

Komentáre (9)