![为什么带有 \\$\{ 的正则表达式可以与egrep一起使用,但不能与sed一起使用?](https://linux22.com/image/47094/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B8%A6%E6%9C%89%20%5C%5C%24%5C%7B%20%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8F%AF%E4%BB%A5%E4%B8%8Eegrep%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%EF%BC%8C%E4%BD%86%E4%B8%8D%E8%83%BD%E4%B8%8Esed%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%EF%BC%9F.png)
给定这样的文本
./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'