为什么`grep fil *`失败?


9

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

我不懂,有人可以解释吗?


您可以添加grep的系统和版本吗?这是因为使用gnugrep 2.16(在Ubuntu 14.04 LTS下),它不会产生任何错误(退出代码0),并且与前三个字母匹配。例如,echo file|grep fil*file 回答。
Hastur

3
@Hastur问题是由正则表达式之前的文件名扩展引起的。我的工作目录包含以fil为前缀的文件,但没有以abc为前缀的文件,因此fil *被文件名替换,但是abc *不变。
tmpbin

谢谢,我没有考虑过。当我尝试时,我会在新目录中尝试...
Hastur

Answers:


31

您的示例有两个问题。

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

较小的问题是,您正在使用未加引号的特殊字符,这些特殊字符表示在glob规则下的某些内容,这意味着shell可以解释它们。如果您在本地目录中有任何文件匹配glob模式fil*abc*shell将对其进行扩展,因此grep将获得扩展的文件名作为模式,而不是预期的RE。每当您在命令行上使用此类字符时,都应引用它们:echo file | grep 'fil.*'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.