grep 两个条件,一个否定,没有管道?

sda*_*aau 3 grep

假设我们有以下内容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显然,平凡的匹配所有内容并且不会避免以数字/哈希字符开头的行#

term1.png

带有-v, --invert-match选项的第二个 grep 的管道通常会弄乱颜色,并且为了保留-H文件名,我将无法为^#(即行首的数字/哈希字符)指定否定匹配,所以我有使用野兽喜欢grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'保留颜色:

term2.png

...但只有在做类似这样的事情之后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)

...具有正确着色的文件名,并匹配。

那么,有没有办法实现这一点 - 但没有上面给出的凌乱的管道,而只是^#用作要避免的模式?

mik*_*erv 5

grep -E '^([^#].*)?app' ./infiles* /dev/null
Run Code Online (Sandbox Code Playgroud)

我猜无论如何评论已经差不多了,但是如果您将行首[^#]非注释匹配?设为可选,那么您要么得到以匹配应用程序开头的行,要么得到以其他内容开头的行,然后最终匹配应用程序-但无论哪种方式,您都不会得到以#.

关于颜色 - 嗯……这取决于正grep则表达式,但是标准的 GNU grep 应该突出显示整个匹配到最后一个应用匹配。如果您想要更具体的内容,您可以info grep查看 GNUgrep在突出显示和适当配置它们时会考虑哪些环境变量,或者,如果没有获得令人满意的结果,请自己突出显示。