web-dev-qa-db-ja.com

すべてのファイルから行を再帰的に見つけて削除する

私は使用してキーワードの出現をなんとかしました

grep "KeyWord" . -r -n -i -I 

ただし、KeyWordの出現回数が多すぎます。そのWordを含むすべての行を削除したいだけです。

探し回ったところ、sedはユーティリティのようです。誰が私にどのコマンドがトリックをするのか教えてもらえますか?

ありがとう。

14
SurenNihalani

GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

OSX sedの場合:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

最初のコマンドfindは、すべての標準ファイル(ディレクトリやパイプなどではない)を検索し、\0で区切って出力します(したがって、ファイル名にはスペースや改行などを含めることができます)。

2番目のコマンドxargsfindの出力を読み取り、区切り記号(\0のために-0)に基づいてリストを取得し、パラメーターを追加してsed -i [...]を呼び出します。リストから(ファイルの数が多い場合、パラメーターの最大長は呼び出しごとに制限されるため、sedは複数回呼び出されます)。

sedコマンドは、インプレース(-i)を変更します。

/KeyWord/dについては、正規表現KeyWordを含む行が削除されます。

(単純だが珍しい)構文を正しく理解するためにsedを学び、関連するツールの詳細については、該当するマンページを参照してください。


そして、私がzshを宣伝したいので、拡張グロブを使用したソリューション:

sed -i /KeyWord/d **/*(.)
25
Pierre Carrier

VimはExモードで使用できます。

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. gグローバル検索

  2. d削除

  3. x保存して閉じる

1
Steven Penny