我运行了几个替代命令作为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"