假设我们有以下内容test.txt
:
# commented line, no match
# commented line, would match /app/
# again commented, would match app
non commented line, matchin /app
non commented line, no match
Run Code Online (Sandbox Code Playgroud)
我想获取所有包含单词“ app
”的行 - 但不是那些有注释的行 - 我希望输出文件名。
grep -H 'app' test.txt
显然,平凡的匹配所有内容并且不会避免以数字/哈希字符开头的行#
:
带有-v, --invert-match
选项的第二个 grep 的管道通常会弄乱颜色,并且为了保留-H
文件名,我将无法为^#
(即行首的数字/哈希字符)指定否定匹配,所以我有使用野兽喜欢grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'
保留颜色:
...但只有在做类似这样的事情之后grep -H app test.txt --color=always | hexdump -C
,我才能看到正确的字符组合,温和地说,这是乏味的。
不幸的是,似乎不能使用该-v
选项在-e PATTERN, --regexp=PATTERN
可以指定多个搜索模式的选项的组合中指定自己的(否定)模式:
:tmp$ grep -H -e 'app' -v '^#' test.txt
grep: ^#: No such file or directory
test.txt:# commented line, no match
test.txt:non commented line, no match
test.txt:
Run Code Online (Sandbox Code Playgroud)
在这里,grep
解释'^#'
为一个文件名,而不是一个搜索模式 - 因此-v
反转了 的匹配app
,我从预期的结果中得到了错误的结果。否则,在此示例中,预期输出仅为一行:
test.txt:non commented line, matchin /app
Run Code Online (Sandbox Code Playgroud)
...具有正确着色的文件名,并匹配。
那么,有没有办法实现这一点 - 但没有上面给出的凌乱的管道,而只是^#
用作要避免的模式?
grep -E '^([^#].*)?app' ./infiles* /dev/null
Run Code Online (Sandbox Code Playgroud)
我猜无论如何评论已经差不多了,但是如果您将行首[^#]
非注释匹配?
设为可选,那么您要么得到以匹配应用程序开头的行,要么得到以其他内容开头的行,然后最终匹配应用程序-但无论哪种方式,您都不会得到以#
.
关于颜色 - 嗯……这取决于正grep
则表达式,但是标准的 GNU grep 应该突出显示整个匹配到最后一个应用匹配。如果您想要更具体的内容,您可以info grep
查看 GNUgrep
在突出显示和适当配置它们时会考虑哪些环境变量,或者,如果没有获得令人满意的结果,请自己突出显示。