假设我有以下文件:
$ 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 的出现。该标志无需修改模式即可实现相同的行为。