0

私の状況は次のとおりです。

  1. さまざまなファイルの長い行に出現する特殊文字を含む非常に長いテキスト文字列があります。文字列を含むファイルは、ファイルシステム全体にあります(Linux)。文字列は、それが発生するファイルのさまざまな行番号にある可能性がありますが、ファイルごとに1回発生します。ただし、文字列には、文字列全体を識別するためにキー入力できる特定のパターンが含まれています。

  2. GREP -lir mystringprefix / pathを使用して文字列の「プレフィックス」を入力することにより、文字列を含むファイルの名前を見つける方法を知っています。

  3. GREPを使用してファイル内の文字列の行番号を判別し、grep -n"prefix"file.nameを使用してSEDを判別する方法を知っています。sed -n“ s / ^([0-9] )[:]。/ \ 1/p」。

  4. sed -i xd / path / file(xは削除する行番号)を使用して、SEDを使用して目的の文字列を含むファイル内の行を削除する方法を知っています。

私の質問は、これらすべてを組み合わせてパターンが含まれているファイルを特定し、名前をGREPに渡してファイルの行番号を特定し、名前と行番号の両方をSEDに渡して行を削除するにはどうすればよいですか?

これは、ファイルシステム内の特定の場所から開始して、再帰的に検索/削除するようにする必要があります。

ありがとうございました。

4

2 に答える 2

2

ものすごく単純:

for file in "$(grep -lir 'prefix' /path/)" ; do
    sed -ibk -e '/prefix/d' "$file"
done

grep -lir prefix /path/これは、ファイル名の改行で区切られたリストを返し、プレフィックスパターンもsed理解できるものであると想定しています。

sed一致する行を見つけprefixて直接削除するように指示しているので、ここで行番号を判別する必要はありません。ただし、攻撃者がファイル名を作成して、予期しないことを実行させる可能性があるため、このfor file in "$(grep ...)"構成はやや安全ではありません。次のように言ったほうがいいでしょう。

grep -lir 'prefix' /path/ --null | while IFS= read -r -d '' file ; do
    sed -ibk -e '/prefix/d' "$file"
done

ただし、ループの本体に割り当てられた変数whileは存続しないことに注意してください。

于 2012-04-04T11:36:28.630 に答える
0

パターンでは大文字と小文字が区別されます。

grep -Zlr 'mystringprefix' /path/ | xargs -0 sed -i '/mystringprefix/d'
于 2017-03-27T23:17:04.930 に答える