特定の文字列を含むファイルから行を削除する方法は? [コピー]

特定の文字列を含むファイルから行を削除する方法は? [コピー]

カンマ区切りのファイルがあります。特定のテキストを見つけて、行全体を削除する必要があります。

例えば

123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883

888を含む行を削除する必要があります。

答え1

使用sed

sed '/888/d' filename

-iオプションを使用して、次のファイルを編集できます。

sed -i.bak '/888/d' filename

メモ: .bak元のファイルのバックアップが保持されます。


特定の列を含む行を削除し、888次を使用する必要があるとします。

awk -F"," '$4 != "888"' filename

答え2

使用grep

grep -vw '888' infile.csv > outfile.csv

その場で編集したい場合は、

sed -i.bak '/\b888\b/d' infile.csv

編集する:

8884列のみを含む行の削除

sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv

答え3

IMOではprintfパイプコマンドを使用するedことがsed -i

printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt

最初の引数は、残りの各引数を改行文字()で区切ってprintf印刷するように指示します。\n

最後の2つの主張のどれも実際に引用を必要としません。私はそれらを例として引用しています。一部のedコマンドには引用が必要です。


なぜedより良いですかsed -i

edとは異なり、sed -i実際の内部編集は行われません。一時出力ファイルを作成し、名前を元のファイルに変更します。これには2つの潜在的な副作用があります。

  • umask一時ファイルを作成した理由によっては、ファイルの権限が変更されることがあります。他のユーザー(もちろん、ファイルとディレクトリへの適切なRWアクセス権を持つユーザー)がスクリプトを実行すると、所有権またはsed -iグループも変更される可能性があります。

  • 代替ファイルには異なるinodeがあります。これによりハードリンクが切断されます。

関連情報