【问题标题】:sed error: "invalid reference \1 on `s' command's RHS"sed 错误:“'s' 命令的 RHS 上的无效引用 \1”
【发布时间】:2013-05-14 07:39:43
【问题描述】:

我运行几个替换命令作为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 expression #7, char 59: `s' 命令的 RHS 上的无效引用 \1

【问题讨论】:

  • 在我的情况下,我将-i(就地编辑选项)与-re 组合在一起,导致-ire(因此-ire 片段用作其@ 987654335@ 参数,因此未启用扩展正则表达式模式);将其更改为 -i -re 解决了这个问题。
  • 还要注意单引号' 和双引号" 的处理方式略有不同,尤其是在解释$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' 无效。

标签: regex sed substitution


【解决方案1】:

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

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

(注:未经测试)

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

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

【讨论】:

  • sed 的-r 选项似乎是反向引用工作所必需的。例如 sed -e 's/([[:digit:]])/is a digit/' 有效,但 sed -e 's/([[:digit:]])/\1 is a digit/ 在没有 -r 到 sed 的情况下产生原始错误。 注意: sed 的第一次调用搜索文字 (<digit>) 并且 不是 捕获组。
  • 答案下方的评论其实是一个答案。也许您可以编辑您的答案以反映它。
  • @AndrewFalanga 你应该发表你的评论作为答案
  • 没关系我的错误是使用-ire 而不是使用-ri。订单很重要:-)
【解决方案2】:

此错误对于未转义的括号很常见。逃离他们并重试。


例如:

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

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

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

【讨论】:

  • 注意,如果你使用-r,你不必转义括号。
【解决方案3】:

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

【讨论】:

    【解决方案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"
    

    【讨论】:

    • 听起来很合理。但它在脚本的上下文中不起作用。
    • 对不起。编辑引发错误:sed: -e expression #7, char 58: Invalid range end。 @Denis 的回答有效。
    • 好的,然后为@Denis 的回答 +1
    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 2012-05-05
    • 2021-06-26
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2013-01-28
    相关资源
    最近更新 更多