2012-04-04 7 views
0
で削除

私の状況は次のとおりです。LinuxのGREP/SED [xargsの]ファイル内のパターンと行番号を見つけ、SED

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

  2. GREP -lir mystringprefix/pathを使用して、文字列の '接頭辞'をキー入力することによって、文字列を含むファイルの名前を見つける方法を知っています。

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

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

私の質問は、その後にSEDに名前と行番号の両方を渡し、私はパターンが含まれているファイルを特定するために一緒にこのすべてを置くことができるか、ファイル内の行番号を決定するためにGREPに名前を渡しです行を削除しますか?

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

ありがとうございます。

答えて

2

非常にシンプル:私たちはgrep -lir prefix /path/は、ファイル名の改行区切りのリストを返すことにし、あなたの接頭辞パターンが理解するsed何かでもあることを前提と

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

sedprefixと一致する行を見つけて直接削除するように指示するので、ここで行番号を決定する必要はありません。しかし、for file in "$(grep ...)"の構造は、攻撃者が意図していないことを行うファイル名を作る可能性があるため、やや安全ではありません。言って良いだろう。

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

whileループの本体に割り当てられた変数はそれに耐えられないだろうということ。

+0

マニュアルページのkのSEDコマンドラインスイッチが見つかりません。そのスイッチは何をしていますか? (あなたの応答はまた、GREP -lirZを使って\ 0を強制することができたことを示唆しています)。 – GWild

+1

@GWild: '-ibk'は' -i bk'と似ていますが、変更時にバックアップファイルを作成するときに使用する接尾辞を指定しています。私は '-i.bak'を使用するとこれがより明白になると思われます。 – Sorpigal

+0

残念ながら、私の場合はどちらの例も動作しません。私は "ジャンプのためのラベルを見つけることができません"というSEDエラーを受け取り、パターン文字列を参照します。私は試みた援助に感謝します。何らかの理由で、SEDは簡単なテキストで窒息しています。なぜ私は最初に行番号を欲しかったのか、それを渡すことができるのかということに行きます。 GREPは問題のない文字列を見つけます。 – GWild

0

パターンはで、大文字と小文字を区別するです。

grep -Zlr 'mystringprefix' /path/ | xargs -0 sed -i '/mystringprefix/d' 
関連する問題