我发现echo file|grep fil*
失败了,但是echo abcd|grep abc*
成功了。
我不明白,有人能解释一下吗?
答案1
你的例子有两个问题。
第一个是你假设常用表达工作方式与全局模式其中*
有一个通配符,意思是“任何字符序列”。在正则表达式中,*
意思是“任意数量的前一个原子”,所以fil*
意思是f
后跟i
零个或多个l
字符。您需要说grep fil.*
才能获得预期的含义:.
意味着“任何单个字符,因此.*
意味着“任何字符序列”。
较小的问题是您使用的不带引号的特殊字符在全局规则下意味着某些内容,这意味着 shell 可以解释它们。如果本地目录中有任何与 glob 模式匹配的文件fil*
或abc*
,shell 会扩展它们,因此grep
会将扩展文件名作为模式,而不是预期的 RE。每当您在命令行上使用此类字符时,都应该引用它们:echo file | grep 'fil.*'
。