grep
这个高亮功能可以在中轻松实现--color
。但grep
不能同时进行正则匹配和反匹配,例如grep foo -v bar ...
(我需要这个功能,因为--color
只能在管道的初始输入时使用|
,因此后者的 grep 将使用该彩色结果,这使得grep foo --color=always ... | grep -v "foo bar"
不会删除那些带有“foo bar”的行)。
因此我使用了awk
上述链接提示,但它缺少突出显示功能。我们可以使用 和 提取正则表达式结果match
,substr
其中我们将正则表达式模式包装在 中match
。然后我们可以通过仅使用ANSI 颜色代码/\<no issue\>/
突出显示正则表达式结果。printf substr($0,1,RSTART-1) "\033[1;31m" substr($0,RSTART,RLENGTH) "\033[0m: " substr($0,RSTART+RLENGTH) "\n"
问:
但match
对于参考链接中由正则表达式构建的布尔表达式不起作用/foo/ && !/bar/
。有没有一种优雅的解决方法(也许使用其他工具)?
我想到了一个临时的解决方法/foo/ && !/bar/{match($0,/foo/); printf ...}
,但这会执行两次正则表达式。
我的预期行为(这里 0.“TODO”最多可以在一行中出现一次 1.我用来*...*
显示要突出显示的内容 2.我只考虑/pattern1/ && !/pattern_included_totally_by_pattern1/
,因此/foo/ && !/o/
不考虑Ed Morton提供的。这就像grep逻辑,我首先grep一些,然后在从前一个grep执行中获得的那些结果中进行grep):
# fail
$ echo "TODO foo\nTODO" | grep TODO --color=always | grep -v "TODO foo"
*TODO* foo
*TODO*
# expected
$ echo "TODO foo\nTODO" | awk -v RED="\033[1;31m" -v RESET="\033[0m" '/TODO/ && !/TODO foo/ {match($0,/TODO/); printf substr($0,1,RSTART-1) RED substr($0,RSTART,RLENGTH) RESET substr($0,RSTART+RLENGTH) "\n"}'
*TODO*