私は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つがあなたのケースに適用されるかどうかは、実際には検索正規表現とファイルの内容によって異なります。