Unix 的扩展正则表达式兼容吗?

Unix 的扩展正则表达式兼容吗?

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 的美元符号,防止其被视为参数扩展。但是greporsed会看到以$for 行尾开头的正则表达式。行尾之后不能有任何内容,因此模式无法匹配。您需要再添加两个反斜杠,或者使用单引号而不是双引号。

相关内容