为什么“grep -r”不接受“*”?

时间:2017-01-20 10:08:29

标签: regex bash grep

我正在使用很多grep -r [text]命令以递归方式查找文本,甚至捆绑在压缩文件中。但是我发现它不适用于“*”表达式:

$ grep -r "*.cert"

[nothing]

$ grep -r "ca.cert"

[entries found]

逃避角色也无济于事。那是为什么?

2 个答案:

答案 0 :(得分:7)

你在某种程度上混淆了正则表达式的globs。在grep中,您要搜索的表达式是正则表达式,因此您必须遵循其规则。

当通配时,*扩展为任何角色。

使用正则表达式时,*是左边事物出现次数的量词。但是你没有在左边指定任何东西!

只需使用.表示任何字符:

grep -r ".*\.cert"
#        ^

另请参阅我如何转义第二个点,因此它是一个文字点而不是元字符。

答案 1 :(得分:1)

在* nix中处理真正任意的文件名是出乎意料的困难,接近不可能。要获得同一作者的展示:Thisthis

因此要求是找到“xy.cert”形式的所有文件,但那些文件。我们不想找到“xycert”或“xy.certificate”。

如果我们可以假定在“.cert”之后没有空格的文件名(例如,“xy.cert my butt”,这是现代文件系统中的合法文件名),我们可以简单地使用{ {1}}。这会在其后面或EOF处查找带有空格的“.cert”。 '\.cert\>'表示单词的结尾,因此“xy.certificate”不匹配。

如果不想找到名为“.cert”的文件,我们应该说\>,类似于我的评论。 (我将星号更改为加号,以便在点之前的文件名中至少强制执行一个非空格。)我必须使用'[^[:space:]]+\.cert\>'作为该模式。