grep是否将前导*视为文字字符?

grep是否将前导*视为文字字符?,grep,Grep,我最近注意到GNU grep的这种行为: $ grep '*' <<< 'aaa'; echo $? 1 $ grep '*' <<< 'aa**aa' aa**aa 这对非正则表达式的人来说可能很直观,但我觉得很奇怪。我已经浏览了man grep,但找不到任何关于这种行为的相关描述 为什么grep不抱怨这个无效的正则表达式,而是将位置不正确的元字符视为文字字符呢?在中,*需要在找到一个*字符时匹配它: 在括号表达式中 作为整个BRE的第一个字符(在首字

我最近注意到GNU grep的这种行为:

$ 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
     ^^