为什么`grep fil*` 会失败?

tmp*_*bin 9 shell grep quoting regular-expression wildcards

我发现echo file|grep fil*失败了,但echo abcd|grep abc*成功了。

没看懂,谁能解释一下?

War*_*ung 31

你的例子有两个问题。

主要的原因是您假设正则表达式的工作方式与glob 模式相同,因为它*是一个通配符,意思是“任何字符序列”。在正则表达式中,*表示“前一个原子的任意数量”,因此fil*表示f后跟i零个或多个l字符。您需要说grep fil.*以获得预期含义:.表示“任何单个字符,因此.*表示“任何字符序列”。

较小的问题是您使用了不带引号的特殊字符,这些字符在 glob 规则下意味着某些东西,这意味着 shell 可以解释它们。如果本地目录中有与 glob 模式匹配的任何文件fil*or abc*shell 将展开它们,因此grep会将展开的文件名作为模式获取,而不是预期的 RE。每当您在命令行上使用此类字符时,都应该引用它们:echo file | grep 'fil.*'.