テキストファイル中の特定の文字列を含む行を削除する

sedを使って、テキストファイルの中の特定の文字列を含むすべての行を削除するにはどうしたらいいですか?

ソリューション

行を削除して、出力を標準出力にするには

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

ファイルを直接変更する場合 - BSDのsedでは動作しません。

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

同じですが、BSD sed(Mac OS XとFreeBSD)の場合 - GNU sedでは動作しません。

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

ファイルを直接変更する(バックアップを作成する)場合 - BSDおよびGNU sedで動作します。

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

特定の文字列を含む行を削除する方法は、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 以降)

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

GNU grep

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

そしてもちろん sed (逆数を印刷する方が実際の削除よりも速い)。

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

sedを使って、ファイルの所定の位置にある行を置き換えることができます。しかし、grepを使って逆に2つ目のファイルに入れて、2つ目のファイルを元のファイルの上に移動させるよりもずっと遅いようです。

e.g.

sed -i '/pattern/d' filename      

または

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

私のマシンでは、最初のコマンドは3倍の時間がかかります。

解説 (9)