给定这样的文本
./RFF_09 -f${FILE} -c${COND}
在文件内,此egrep命令将正确匹配:
egrep './RFF(.*) (.*)-c\\$\{COND\}' file
但这个 sed 命令不会
sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':./RFF$1 $2-cRFF$1:gp"
它将失败sed: -e expression #1, char 38: invalid content of \{\}
。我也尝试过
sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp" file
sed -n s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp file
得到相同的结果。
sed -n "s:'./RFF(.*) (.*)-c\\$\\{COND\\}':DUMMY:gp" file
不会给我错误消息,但不会匹配。
我究竟做错了什么?或者更好:如何按照原始命令的建议替换文本?我使用的是相当旧版本的 sed (4.1.2) 和 egrep (2.5.1),因此即使您无法使用较新版本重现错误,也可以使用解决方法。
答案1
如果你使用egrep 意味着 grep 具有扩展的正则表达式语法,因此为了能够将您的模式传输到 sed 中,您必须添加参数-r(--regexp-extended)
或-E
在某些版本中。
关于你的表达你有额外的\
所以c
即使使用egrep它不匹配
\1
另外,你最好使用$1
反向匹配。
所以最终命令可能是:
sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp'
或者
sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp'