grep是否将前导*视为文字字符?
我最近注意到GNU grep的这种行为:grep是否将前导*视为文字字符?,grep,Grep,我最近注意到GNU grep的这种行为: $ grep '*' <<< 'aaa'; echo $? 1 $ grep '*' <<< 'aa**aa' aa**aa 这对非正则表达式的人来说可能很直观,但我觉得很奇怪。我已经浏览了man grep,但找不到任何关于这种行为的相关描述 为什么grep不抱怨这个无效的正则表达式,而是将位置不正确的元字符视为文字字符呢?在中,*需要在找到一个*字符时匹配它: 在括号表达式中 作为整个BRE的第一个字符(在首字
$ grep '*' <<< 'aaa'; echo $?
1
$ grep '*' <<< 'aa**aa'
aa**aa
这对非正则表达式的人来说可能很直观,但我觉得很奇怪。我已经浏览了man grep
,但找不到任何关于这种行为的相关描述
为什么grep不抱怨这个无效的正则表达式,而是将位置不正确的元字符视为文字字符呢?在中,*
需要在找到一个*
字符时匹配它:
- 在括号表达式中
- 作为整个BRE的第一个字符(在首字母“^”之后,如果有)
- 作为子表达式的第一个字符(在首字母“^”之后,如果有)
grep'*'
,grep'^*'
,grep'\(*\)'
,grep'\(^*\)'
,grep'[*]'
都需要在文本上匹配
不同的是(与
grep-E
一起使用),如果*
(或+
,?
,{x,y}
)在这些上下文中使用(这允许一些实现实现一些扩展的(?)
,(*)
例如,运算符,尽管大多数实际上报告了错误)根据,GNU grep不会按照POSIX标准运行,即使您使用POSIXLY_CORRECT环境变量?
在BRE中不是元字符,所以grep'?*'@Sundeep所以OK我对问号的理解是错误的,但星号呢(我敢肯定这一次)?是我找到的最接近的答案。参见答案+评论
$ grep '*?' <<< 'aaa***???bbb'
aaa***???bbb
^^