Unix 的工具正则表达式完全兼容吗?
例如,如果我grep -oE "\$text *\( *([^)]) *\)"
使用,我是否可以保证更换我得到的确切部分sed -E "s/\$text *\( *([^)]) *\)/replacement/g"
?这扩展到所有正则表达式?
这些匹配到什么程度(或不匹配)?
顺便说一句,我的 man sed 没有显示-E
开关 - 但仍然有效,并告诉我正则表达式开关是-r
。-E
和 是-r
同一个东西吗?
答案1
GNU grep 和 GNU sed 的手册都提到了-E
使用扩展正则表达式的选项:
grep:
-E
--extended-regexp
将模式解释为扩展正则表达式 (ERE)。 (-E 由 POSIX 指定。)
sed:
-E
-r
--regexp-extended
使用扩展正则表达式而不是基本正则表达式。
(还提到-E
之前受到支持但未记录。)
您可以检查两者支持的正则表达式的确切定义,但您的正则表达式看起来足够标准。事实上,它看起来相当于基本的正则表达式\$text *( *[^)] *)
(除非您的sed
替换使用捕获组)。
但是,请注意,正如所写的(用双引号引起来的),它不会匹配任何内容。反斜杠将转义 shell 的美元符号,防止其被视为参数扩展。但是grep
orsed
会看到以$
for 行尾开头的正则表达式。行尾之后不能有任何内容,因此模式无法匹配。您需要再添加两个反斜杠,或者使用单引号而不是双引号。