当两个匹配项位于同一行时,Grep -H 并不总是返回文件路径

当两个匹配项位于同一行时,Grep -H 并不总是返回文件路径

我使用 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] .

大多数匹配都打印文件名,但少数只打印匹配的字符串。 -H 和 -o 是否互斥,因为 -o 正在修剪文件名?示例输出:

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

第四个 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

有人知道让两个匹配项打印文件名的解决方案吗?

答案1

不,-H并且-o并不相互排斥。匹配的部分中可能有回车符。这将使以下文本写入行的开头,从而覆盖文件名。

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

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

另外,由于这两行属于同一文件baz.txt(如果您的示例正确),这也可能是由于长行(大于屏幕宽度)被换行到下一行。

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

这些场景之一是否适用于您的情况实际上取决于您的搜索正则表达式和文件的内容。

相关内容