INPUT | grep --color=always "$string\{1,1\}"
... 唉, $string 的每个实例都被突出显示了。在我阅读文档时,“{1,1}”应该确保只突出显示第一个实例。或者有更好的工具吗?我不能使用 sed
INPUT | sed -r "s|$string|${red}$string${nrm}|I"
( ${red} 和 ${nrm} 只是颜色代码)
因为这里的 INPUT 是一个文件列表,可能会发现不区分大小写,如果我在 sed 中使用“I”选项,它会强制文件列表的大小写更改为命令输入的确切文本——即是,我想搜索不带大小写的文件,但不管文件列表中字符串的大小写可能恰好是什么,我都不敏感地突出显示。
my_command *file_name*
...将使用“查找”不区分大小写地查找文件,但在列表中我想强调:
file_name
FILE_nAME
file_NAME_this_file_has_a_long_file_name
...但只有第一个实例(文件名可能包含输入字符串的重复项)。因此,在上面的最后一行中,突出显示了“file_NAME”,但没有突出显示“file_name”。
grep 对案例问题没有问题,但 sed 有。OTOH,sed 知道如何在一场比赛后停止,而 grep 似乎不知道。或者,还有更好的方法?
如果你
grep
支持-P
类似 perl 的正则表达式,你可以这样做:每行只能匹配一次,因为我们
^
用于将匹配锚定在行的开头。紧随其后的是匹配尽可能少的.*?
任意数量的字符,并且在/内,因此变量的内容按字面匹配,即使它恰好包含正则表达式运算符(除了)。指定只有后面的内容是ept,所以这里是彩色的。$string
\Q
\E
$string
\E
\K
K
或者您可以使用真实的东西而不必依赖任何 GNUism:
即使
$string
包含\E
.我认为如果使用模式替换就可以使用
sed
(匹配不区分大小写,但替换使用捕获的模式,而不是搜索到的模式):此外,正如@don_crissti 所注意到的,如果你想为整个找到的模式着色,你甚至不需要使用捕获组,你可以使用“whatever it was”
&
代码,它可能也稍微快一点:使用两个字符串而不是颜色代码,它似乎适用于我的 bash:
第三行的第二个“amd”没有被替换,所有其他替换的都保持原来的大小写。
grep
语法意味着它将匹配模式的第一个连续重复,因此在“bababa”中将仅匹配第一个“ba”,但在“baba___ba”中它将匹配第一次和第三次出现。显然grep 为整个匹配着色,因此不能在这种情况下使用。