他のファイルから指定された文字列を含む行を削除する

他のファイルから指定された文字列を含む行を削除する

web/名前がfoo.phpandであるとしますbar.php。最初の行foo.phpは "sdajgeSTRINGdsad"、10行目bar.phpは "gdfhu98324STRING"です。作業は最初にこれら2つのファイルを見つけてから、指定された文字列が「STRING」なので、foo.phpの行1とbar.phpの行10を削除することです。

答え1

sed次のことができます。

sed -i.bak '/STRING/d' web/*

答え2

文字列を含むファイルを検索するには、STRINGを含むファイルとすべてのサブディレクトリをgrep検索するには、次のようにします。web/

grep -R "STRING"ネットワーク/

ファイルを編集して文字列を含む行を削除するにはいくつかのオプションがありますが、これには2つの一般的なオプションがあります。行全体に対して操作を実行したいので、これは非常に簡単です。 :)

grepまず、引数を使用して-v検索を反転し、出力で一致する行を表示する代わりに非表示にすることができます。最初のファイルについては、sponge。これにより、ファイルを読み取ってフィルタリングしてから、同じファイルに書き換えることができます。これらすべてを一度に実行できます。

grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php

2番目の例では、を使用して同じ操作を実行しますgrepが、そのファイルがない場合はsponge別のファイルに書き込んでから、ファイルを元の名前に戻すことができます。

grep -v "gdfhu98324STRING" bar.php  > bar.php.cleaned
mv bar.php{.cleaned,}

sed2番目の方法は、d行削除コマンドで使用されます。最初の例では、.bkバックアップファイルを作成するオプションと一緒に内部ファイル編集を使用します。

sed -i.bk '/sdajgeSTRINGdsad/d'  foo.php

ファイルを直接コピーし、sedを使用してバックアップをフィルタリングして元のファイルを上書きすると、ほぼ同じことができます。

cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php

今、これら2つのタスクを組み合わせてください!別の文字列を使用してこれを繰り返し実行できる関数を作成しましょう。

function nuke_string () {
    string="$1"
    path="$2"
    grep -R -l "$string" "$path" | while IFS= read -r file; do
        sed -i.bk "/$string/d" "$file"
    done
}

関数を作成したら、次のように使用できます。

nuke_string "STRING" web/

STRINGを含むすべてのweb /ファイルからこの行が削除され、元のバージョンのバックアップコピーが作成されます。現在のシェルでこれらの関数を作成するか、.bashrcファイルに書き込むことで常に使用可能にすることができます。

答え3

grep -lただ一緒に使用してください-R!これは完全なシングルライナーです。

grep -Rl "STRING" web/ | xargs sed -i "/STRING/d"

答え4

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

for k in web/*.php
do
  ex -sc '/STRING/d|x' "$k"
done
  1. d削除

  2. x保存して閉じる

関連情報