Jak bych mohl použít sed k odstranění všech řádků v textovém souboru, které obsahují určitý řetězec?
Odstranění řádku a vypsání výstupu na standardní výstup:
sed '/pattern to match/d' ./infile
Přímá úprava souboru - nefunguje s BSD sed:
sed -i '/pattern to match/d' ./infile
Totéž, ale pro BSD sed (Mac OS X a FreeBSD) - nefunguje s GNU sed:
sed -i '' '/pattern to match/d' ./infile
Přímá úprava souboru (a vytvoření zálohy) - funguje v BSD a GNU sed:
sed -i.bak '/pattern to match/d' ./infile
Kromě sed
existuje mnoho dalších způsobů, jak odstranit řádky s určitým řetězcem:
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
A samozřejmě sed
(vypsání inverze je rychlejší než skutečné mazání):
sed -n '/pattern/!p' file
Pomocí příkazu sed můžete v souboru nahradit řádky na místě. Zdá se však, že je to mnohem pomalejší než použití grepu pro inverzní zápis do druhého souboru a následné přesunutí druhého souboru nad původní.
Např.
sed -i '/pattern/d' filename
nebo
grep -v "pattern" filename > filename2; mv filename2 filename
První příkaz trvá na mém počítači stejně třikrát déle.