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

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

我想获取包含单词 ' app' 的所有行, - 但是不是那些有评论的, - 我希望输出文件名。

显然,这个微不足道的grep -H 'app' test.txt匹配所有内容,并且不会避免以数字/哈希字符开头的行#

术语1.png

带有第二个带有选项的 grep 的管道-v, --invert-match通常会弄乱颜色,并且为了保留-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:

在这里,grep解释'^#'为文件名,而不是搜索模式 - 因此-v反转 的匹配app,并且我从预期的结果中得到了错误的结果。否则,在此示例中,预期输出只有一行:

test.txt:non commented line, matchin /app

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

那么,有没有一种方法可以实现这一点 - 但没有上面给出的混乱管道,并且简单地使用^#作为要避免的模式?

答案1

grep -E '^([^#].*)?app' ./infiles* /dev/null

我想无论如何,注释已经几乎包含了它,但是如果您将行首[^#]非注释匹配设置?为可选,那么您要么得到以匹配开头的行应用程序或者你得到以其他内容开头然后最终匹配的行应用程序- 但无论哪种方式,你都不会得到以 开头的行#

关于颜色 - 嗯...这取决于grep和 regexp,但是标准的 GNU grep 应该突出显示整个匹配到最后一个应用程序匹配。如果你想要更具体,你可以info grep看看 GNUgrep在突出显示和适当配置它们时会考虑哪些环境变量,或者,如果在这方面未能获得令人满意的结果,请自行突出显示。

相关内容