grep : '+' 特殊字符

rem*_*rem 5 grep

我用 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 中转义非特殊字符“+”会使其成为特殊字符?

Ste*_*itt 7

这是一个 GNU 扩展。从grep(1)联机帮助页

在 GNU 中grep,基本语法和扩展语法之间的可用功能没有区别。在其他实现中,基本的正则表达式功能较弱。以下说明适用于扩展正则表达式;后面总结了基本正则表达式的差异。

再往下

基本与扩展正则表达式

在基本的正则表达式的元字符?+{|(,和) 失去了特殊的意义; 改用反斜杠的版本\?\+\{\|\(,和\)