说服 grep 输出所有行,而不仅仅是那些匹配的行

说服 grep 输出所有行,而不仅仅是那些匹配的行

假设我有以下文件:

$ cat test

test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4

默认情况下,grep返回包含搜索词的每一行:

$ grep test test

test line 1
test line 2
test line 3 with two test words
test line 4

传递--color参数grep将使其突出显示与搜索表达式匹配的行部分,但它仍然只返回包含该表达式的行。有没有办法输出grep源文件中的每一行,但突出显示匹配项?

我目前实现此目的的可怕黑客(至少在没有 10000+ 连续行且没有匹配项的文件上)是:

$ grep -B 9999 -A 9999 test test

两个命令的截图

如果grep无法完成此任务,是否有其他命令行工具提供相同的功能?我摆弄过ack,但似乎也没有选择。

答案1

grep --color -E "test|$" yourfile

我们在这里所做的是匹配$图案和测试图案,显然$没有任何可着色的东西,因此只有测试图案获得颜色。只是-E打开扩展正则表达式匹配。

您可以像这样轻松地创建一个函数:

highlight () { grep --color -E "$1|$" "${@:1}" ; }

答案2

ack --passthru --color string file

对于 Ubuntu 和 Debian,使用 ack-grep 而不是 ack

ack-grep --passthru --color string file

答案3

另一种方法可以做到这一点适当地便携式的with grep(除了在接受的答案中使用两个交替的正则表达式之外)是通过空模式(以及相应的空字符串)。
它应该同样适用于-E-F开关,因为,按照标准:

-E
    Match using extended regular expressions. 
    [...] A null ERE shall match every line.

-F
    Match using fixed strings.
    [...] A null string shall match every line.

所以这只是跑步的问题

grep -E -e '' -e 'pattern' infile

和 分别

grep -F -e '' -e 'string' infile

答案4

ripgrep

ripgrep与其参数一起使用--passthru

rg --passthru pattern file.txt

这是其中之一最快的 grep 工具,因为它是建立在Rust 的正则表达式引擎它使用有限自动机、SIMD 和积极的文字优化来使搜索速度非常快。

--passthru- 打印匹配和不匹配的行。

实现类似效果的另一种方法是修改模式以匹配空字符串。例如,如果您正在使用 using 进行搜索,rg foo则 usingrg "^|foo"相反 将发出搜索到的每个文件中的每一行,但只会突出显示 foo 的出现。该标志无需修改模式即可实现相同的行为。

相关内容