SED 错误:"invalid reference 1 on `s' command's RHS"



我运行了几个替代命令作为maven着色脚本的核心。其中一个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" 

Error: 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 expression #7, char 59:无效引用1在's '命令的RHS

您不需要实际捕获它的工作吗?例如,对于变量#2:

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

(注:未测试)

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

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

未转义的括号通常会出现此错误。逃避它们,然后再试一次。


例如:

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

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

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

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

您需要在.之后转义/

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"

最新更新