我正在使用很多grep -r [text]
命令以递归方式查找文本,甚至捆绑在压缩文件中。但是我发现它不适用于“*”表达式:
$ grep -r "*.cert"
[nothing]
$ grep -r "ca.cert"
[entries found]
逃避角色也无济于事。那是为什么?
答案 0 :(得分:7)
你在某种程度上混淆了正则表达式的globs。在grep
中,您要搜索的表达式是正则表达式,因此您必须遵循其规则。
当通配时,*
扩展为任何角色。
使用正则表达式时,*
是左边事物出现次数的量词。但是你没有在左边指定任何东西!
只需使用.
表示任何字符:
grep -r ".*\.cert"
# ^
另请参阅我如何转义第二个点,因此它是一个文字点而不是元字符。
答案 1 :(得分:1)
在* nix中处理真正任意的文件名是出乎意料的困难,接近不可能。要获得同一作者的展示:This和this。
因此要求是找到“xy.cert”形式的所有文件,但仅那些文件。我们不想找到“xycert”或“xy.certificate”。
如果我们可以假定在“.cert”之后没有空格的文件名(例如,“xy.cert my butt”,这是现代文件系统中的合法文件名),我们可以简单地使用{ {1}}。这会在其后面或EOF处查找带有空格的“.cert”。 '\.cert\>'
表示单词的结尾,因此“xy.certificate”不匹配。
如果不想找到名为“.cert”的文件,我们应该说\>
,类似于我的评论。 (我将星号更改为加号,以便在点之前的文件名中至少强制执行一个非空格。)我必须使用'[^[:space:]]+\.cert\>'
作为该模式。