Grep -Hは、2つの一致が同じ行にあるときは常にファイルパスを返しません。

Grep -Hは、2つの一致が同じ行にあるときは常にファイルパスを返しません。

私はgrepを使ってファイルを再帰的に調べ、パターンに一致するすべての文字列を抽出します。ファイルパスを印刷したい:一致する文字列。

-H should print the file path for each entry

-o should print just the matched string, omitting everything else on the line I don't want

-r recursive search.

私は走る:

grep -Hro [pattern] .

ほとんどの一致はファイル名を印刷しますが、一部は一致する文字列のみを印刷します。 -oがファイル名を切り捨てるので、-Hと-oは相互に排他的ですか?出力例:

./path/foo.txt: foo
./path/bar.txt: foo
./path/baz.txt: foo
foo
./path/baz.txt: foo

4番目のfoo一致にも関連付けられたファイルが必要ですが、印刷されません。

私はこのように振る舞う郵便はがきしかし、-Hフラグを使用しましたが、 "/dev/null"ソリューションも機能しません。

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

編集する:

追加のナビゲーションの後、正規表現はファイル名のすべての一致を取得できず、両方の文字列が同じ行で一致したときに両方が発生しました。たとえば、次のテキストファイルは

foo
foo sometext foo
foo

出力

./path/foo.txt: foo
./path/foo.txt: foo
foo
./path/foo.txt: foo

2つの一致がファイル名を印刷できるようにするソリューションを知っている人はいますか?

ベストアンサー1

いいえ、相互に排他的ではありません-H-o一致する部分にキャリッジリターンがある可能性があります。これにより、次のテキストが行の先頭に書き込まれ、ファイル名が上書きされます。

$ printf 'foobar\n' | grep -Ho '.bar'
(standard input):obar

$ printf 'foo\rbar\n' | grep -Ho '.bar'
bar

また、これらの2行は同じファイルに属するためbaz.txt(例が正しい場合)、長い行(画面の幅より大きい)が次の行に進む場合にも発生する可能性があります。

$ printf 'foo%80sbar\n' | grep -Ho 'foo.*'
(standard input):foo
       bar

これらのシナリオの1つがあなたのケースに適用されるかどうかは、実際には検索正規表現とファイルの内容によって異なります。

おすすめ記事