127

我运行几个替换命令作为maven 的 colorize 脚本的核心。其中一个sed命令使用了一个正则表达式,该表达式在 shell 中起作用,如此处所讨论的。当前(不工作)的实现可以在这里找到。

当我将命令的变体之一包含到脚本中时,会发生不同的行为:

变体 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

适应脚本:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

错误: shell 输出的信息与我输入的信息相同$ sed。奇怪的!?


变体 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

适应脚本:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

错误:

sed: -e 表达式 #7, char 59: 's' 命令的 RHS 上的无效引用 \1

4

4 回答 4

84

您不需要实际捕获才能使其正常工作吗?即变体#2:

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(注:未经测试)

如果没有-r参数,反向引用(如\1)将不起作用,除非每个括号都用\字符转义。

使用-r, 参数反向引用(如\1)将不起作用,除非括号没有被转义。

于 2013-05-19T18:10:07.717 回答
58

对于未转义的括号,此错误很常见。逃离他们,然后再试一次。


例如:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

应该在每个括号之前用反斜杠转义:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g
于 2016-01-18T22:34:55.197 回答
25

如果未提供-r/--regexp-extended选项,则必须对捕获括号进行转义。

于 2019-03-06T14:55:45.160 回答
7

你需要逃跑/之后.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

或者,如果您不想担心转义,请使用|

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

编辑:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"
于 2013-05-19T18:15:13.070 回答