Sed 错误: “‘ s’命令的 RHS 上的引用1无效”

作为 给脚本着色的核心,我运行了几个替换命令。 其中一个 sed命令使用一个正则表达式,该表达式在 shell 中作为 在这里讨论工作。可以找到当前(不工作的)实现 给你

当我将命令的一个变体包含到脚本中时,会发生不同的行为:

变种一:

$ 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无效

115509 次浏览

难道你不需要实际捕获它们才能工作吗? 例如,对于变体 # 2:

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

(注: 未经测试)

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

对于 -r,除非不转义括号,否则参数反向引用(如 \1)将无法工作。

你需要在 .之后逃离 /

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"

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


例如:

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

应在每个括号前加上反斜杠:

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

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