sed的正则表达式,有扩展正则与基本正则(或叫非扩展正则)之分,默认非扩展。两者区别主要是对几个特殊字符的定义上:即 问号‘?’,加号 ‘+’, 圆括号‘()’, 花括号‘{}’, 竖线管道符 ‘|’
这是个坑,尤其对习惯使用扩展正则语法的用户而言。
我们一般用的是 GNU 的 sed ,以之为例。
具体来说,两者区别是,在基本正则中,上述几个字符本身没有定义特殊功能,与其它普通字符一样,只代表它们字面上的字符。而在扩展正则上,则有相应的定义。
不过,事实上,在基本正则模式下,还是能让这几个字符表示相应的正则符号定义,方法是用反斜线\转义一下。这样就显得有点怪异了,扩展与非扩展功能完全一致,除了这几个字符的转义与否正好相反。猜测,在基本正则里的这个约定是GNU sed干的。其他版本的sed的基本模式下,完全不支持扩展语法。
所以了,最佳的使用习惯是,准确的区分是否用扩展正则的语法,如果用了,那就指定 -E 参数以启用扩展。否则,就完全不要用,尤其最好不要用依赖GNU sed里基本正则定义的怪异的扩展语法。
按GNU sed 的手册有如下
In GNU sed, the only difference between basic and extended regular expressions is in the behavior of a few special characters: ‘?’, ‘+’, parentheses, braces (‘{}’), and ‘|’.
With basic (BRE) syntax, these characters do not have special meaning unless prefixed with a backslash (‘\’); While with extended (ERE) syntax it is reversed: these characters are special unless they are prefixed with backslash (‘\’).