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

JJD*_*JJD 85 regex sed substitution

我运行几个替换命令作为mavencolorize脚本的核心.其中的sed命令,使用正则表达式,在shell工作发现这里讨论.可以在此处找到当前(不工作)的实现.

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

变式1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Run Code Online (Sandbox Code Playgroud)

适应脚本:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Run Code Online (Sandbox Code Playgroud)

错误: shell输出的信息与我输入的信息相同$ sed.奇怪!?


变式2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Run Code Online (Sandbox Code Playgroud)

适应脚本:

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

错误:

sed:-e表达式#7,char 59:`s'命令的RHS上的引用\ 1无效

e18*_*18r 47

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


例如:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g
Run Code Online (Sandbox Code Playgroud)

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

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g
Run Code Online (Sandbox Code Playgroud)

  • 注意,如果您使用`-r`,则不必转义括号。 (7认同)

Den*_*rdy 38

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

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

(注:未经测试)

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

  • sed的`-r`选项似乎是后引用工作所必需的.例如`sed -e's /([[:digit:]])/是一个数字/'`工作但是`sed -e'/([[:digit:]])/\1是一个数字/`生成没有`-r`的原始错误.**注意:**第一次调用sed搜索文字`(<digit>)`和**不是**捕获组. (34认同)
  • 没关系我的错误是使用 `-ire` 而不是使用 `-ri`。订单很重要:-) (2认同)
  • `-r, --regexp-extended` = `在脚本中使用扩展正则表达式。` 在大多数当前版本中,`-E` 和 `-r` 都可以使用。扩展而不是基本。 (2认同)

Sto*_*ica 22

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


sla*_*art 7

你需要逃避/之后.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想担心逃逸,请使用 |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"
Run Code Online (Sandbox Code Playgroud)

编辑:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"
Run Code Online (Sandbox Code Playgroud)

  • 好的,然后为@Denis 的回答 +1 (2认同)