sed错误:“s'命令的RHS上的无效引用\ 1”

时间:2013-05-19 18:06:14

标签: regex sed substitution

我运行了几个替换命令作为colorize script for maven的核心。 其中一个sed命令使用正则表达式,它在shell中以discussed here的形式查找。可以找到当前(不工作)的实现here

当我在脚本中包含命令的一个变体时,会出现不同的行为:

变式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 个答案:

答案 0 :(得分:46)

此错误对于未转义的括号很常见。逃脱它们并再试一次。

例如:

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

在每个括号前应使用反斜杠进行转义:

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

答案 1 :(得分:34)

你不需要实际捕获它才能工作吗?即对于变体2:

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

(注意:未经测试)

如果没有-r参数,则返回引用(如\ 1)将无法正常工作。

答案 2 :(得分:4)

您需要在/

之后转义.
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"

答案 3 :(得分:0)

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