Pierre-Antoine Guillaume Asked: 2018-02-24 06:06:26 +0800 CST2018-02-24 06:06:26 +0800 CST 2018-02-24 06:06:26 +0800 CST Unix 的扩展正则表达式是否兼容? 772 Unix 的工具正则表达式完全兼容吗? 例如,如果我grep -oE "\$text *\( *([^)]) *\)",如果我使用,我是否保证替换我得到的确切部分sed -E "s/\$text *\( *([^)]) *\)/replacement/g"?这扩展到所有正则表达式? 这些匹配(或不匹配)到什么程度? 在旁注中,我的 man sed 没有显示-E开关 - 但仍然有效,并告诉我正则表达式开关是-r. 是-E和-r 同一件事吗? grep sed 1 个回答 Voted Best Answer ilkkachu 2018-02-24T06:36:37+08:002018-02-24T06:36:37+08:00 GNU grep 和 GNU sed 的手册都提到-E了使用扩展正则表达式的选项: grep: -E --extended-regexp 将模式解释为扩展正则表达式 (ERE)。(-E 由 POSIX 指定。) 赛德: -E -r --regexp-extended 使用扩展正则表达式而不是基本正则表达式。 (还有一个提到-E被支持但之前没有记录。) 您可以检查两者支持的正则表达式的确切定义,但您的正则表达式看起来足够标准。事实上,它看起来等同于基本的正则表达式\$text *( *[^)] *)(除非您的sed替换使用捕获组)。 但是,请注意,如所写(用双引号括起来),它不会匹配任何内容。反斜杠将转义 shell 的美元符号,防止它被视为参数扩展。但是grepor会看到一个以for end of linesed开头的正则表达式。$行尾后不能有任何内容,因此模式无法匹配。您需要再添加两个反斜杠,或者使用单引号而不是双引号。
GNU grep 和 GNU sed 的手册都提到
-E
了使用扩展正则表达式的选项:grep:
赛德:
(还有一个提到
-E
被支持但之前没有记录。)您可以检查两者支持的正则表达式的确切定义,但您的正则表达式看起来足够标准。事实上,它看起来等同于基本的正则表达式
\$text *( *[^)] *)
(除非您的sed
替换使用捕获组)。但是,请注意,如所写(用双引号括起来),它不会匹配任何内容。反斜杠将转义 shell 的美元符号,防止它被视为参数扩展。但是
grep
or会看到一个以for end of linesed
开头的正则表达式。$
行尾后不能有任何内容,因此模式无法匹配。您需要再添加两个反斜杠,或者使用单引号而不是双引号。