2012-03-05 37 views

答えて

4

grep -lはファイル名のみを表示します。

私はそれが十分に解決しない場合は、何か

vi $(grep -l pattern) # edit all files containing pattern 

を含むファイルを編集するためのすべての時間があなたの質問を絞り込んでください、これを使用しています。

+0

ありがとうございました。 '-l'は本当に必要な操作ですが、複数のパターンがある場合、どのパターンを同時にすべてのパターンに一致する行を含むよりも見つけることができますか? – user1224398

+0

素晴らしいKaz!このコマンドは非常に役に立ちます! :) –

+0

複数のパターンをANDのように組み合わせることについては、上記の考え方に従ってください。 pattern1と一致するファイルのリストを取得します。次にそれを別のgrep -lにフィードします。私はこれに対してもう一度答えよう。 – Kaz

0

洗練は私の最初の答えの下のコメントで与えられました。複数のパターンがあり、タスクはそれらのすべてに一致するファイルのリストを取得することです。 GNUを含むほとんどのgrepは、正規表現&交差演算子を実装していません。まず、最初のパターンに一致するファイルのリストを取得します。次に、そのファイルのリストを別のgrepに送って次のパターンに対してテストします。

grep -l pat2 $(grep -l pat1 $(grep -l pat0 *))) 

# $(grep -l pat0 *) gets replaced with the names of files matching pat0 
# then $(grep -l pat1 <list>) is further refined to include only those matching pat1 
# then $(grep -l pat2 <that-list>) is refined once more 

xargsのを使用したソリューションは、ネストを離れて折るだけでなく、上記の溶液中でいくつかの弱点に対処します。ファイル名にスペースがある場合

一つのアプローチは、コマンド不器用で置換し、休憩です。私たちは、それぞれのgrep -l段階でのファイル出力のリストを取り、xargsのを使用して、次のステージの引数に変換:このため

grep -l pat0 * | xargs grep -l pat1 | xargs grep -l pat2 

A「コンパイラ」を書き込むことができ、例えばもちろん

# the multigrep shell function takes these arguments and produces a pipeline 
# like above, then evaluates it using eval. 

multigrep pat0 pat1 pat2 * 

元のメッセージに取り上げられるようパターンだけで、文字列に固定されている場合、grepするに-Fを追加します。

+0

xargsは単にgrepを実行し、stdinからのマテリアルを期待するので、ステージが空のファイルリストを生成すると、この問題は解消します。通常の/ dev/null引数のハックを適用することができます。もちろん、GNU xargsには空の場合は実行されません。 – Kaz

+0

ありがとうございました! – user1224398

+0

GNU grepには、あなたが探している正規表現の機能を持つ-P(PCRE)が必要です。 – jordanm

関連する問題