我用 grep '+' 和 '*' 特殊字符做了一些简单的测试
$ echo 'where wh+'> /tmp/toto
$ grep 'wh[e]\*' /tmp/toto
$ grep 'wh[e]*' /tmp/toto
where wh+
$ grep 'wh[e]+' /tmp/toto
$ grep 'wh+' /tmp/toto
$ grep 'wh[e]\+' /tmp/toto
where
$ grep -E 'wh[e]*' /tmp/toto
where wh+
$ grep -E 'wh[e]+' /tmp/toto
where wh+
Run Code Online (Sandbox Code Playgroud)
从这些测试中,非扩展 grep '+'(和 '?')不会被解释为特殊字符,为了将其用作特殊字符,必须对其进行转义。正如我所读到的,grep 使用基本正则表达式(没有 -E 选项),在这种情况下,这里定义了特殊字符:http : //pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03 和 '? ' '+' 不是 BRE 的特殊字符。
但是为什么在 BRE 中转义非特殊字符“+”会使其成为特殊字符?
这是一个 GNU 扩展。从grep(1)联机帮助页:
在 GNU 中
grep,基本语法和扩展语法之间的可用功能没有区别。在其他实现中,基本的正则表达式功能较弱。以下说明适用于扩展正则表达式;后面总结了基本正则表达式的差异。
再往下
基本与扩展正则表达式
在基本的正则表达式的元字符
?,+,{,|,(,和)失去了特殊的意义; 改用反斜杠的版本\?,\+,\{,\|,\(,和\)。