【发布时间】: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(因此-i将re片段用作其@ 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