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

问题描述 投票:72回答:4

我运行几个替换命令作为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无效

regex sed substitution
4个回答
37
投票

您是否需要实际捕获它才能工作?即对于变体2:

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

(注:未经测试)

如果没有-r参数,则返回引用(如\ 1)将不起作用。


46
投票

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


例如:

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

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

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

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"

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.