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


103

我运行一些替换命令作为mavencolorize脚本的核心。其中的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,字符59:`s命令的RHS上无效的引用\ 1


10
在我的情况下,我将-i(原位编辑选项)与组合在一起(-re导致-ire-i使用该re片段作为其SUFFIX参数,因此未启用扩展的regex模式));进行更改以-i -re解决问题。
Janaka Bandara

还应注意,单引号'和双引号"的处理方式略有不同,尤其是在解释时$vars。例如:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"有效,但是:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'无效。
not2qubit

Answers:


51

您不是真的需要捕获才能正常工作吗?即对于变体2:

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

(注:未经测试)

没有-r参数,反向引用(如\ 1)将无法工作。


42
-r选项sed的出现,为向后引用的工作是必要的。例如,sed -e 's/([[:digit:]])/is a digit/'可以正常工作,但sed -e 's/([[:digit:]])/\1 is a digit/会产生原始错误,而无需-r安装。 注意: sed的第一次调用将搜索文字(<digit>)而不是捕获组。
Andrew Falanga

答案下方的评论实际上是答案。也许您可以编辑答案以反映出来。
miroxlav'9

@AndrewFalanga,您应该已将您的评论作为答案发布
sanmai

2
没关系,我的错误是使用-ire而不是使用-ri。订单事项:-)
m3nda

54

对于没有转义的括号,此错误很常见。逃脱它们,然后重试。


例如:

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

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

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

6
注意,如果使用,则-r不必转括号。
qräbnö

13

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


5

您需要/.

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"

听起来合理。但这在脚本上下文中不起作用。
JJD

抱歉。编辑将引发错误:sed: -e expression #7, char 58: Invalid range end。@Denis的答案有效。
JJD

2
好的,然后为@Denis的答案+1
slackmart
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.