使用sed计算可选组和backref

时间:2016-03-09 16:08:33

标签: bash sed backreference

关于在配置中交换键/值对的值,并想知道如果在backrefs可以有不同的索引时如何在sed中完成此操作:

$ echo "#foo=bar" | sed "s|^\(#\)\(foo=\)\(.*\)|\2new_bar|g"
foo=new_bar

精细。但是,可能是,评论标志不存在,所以第一组(#)不在那里。 - 然后\ 2实际上是\ 1。

$ echo "foo=bar" | sed "s|^\(#\)\(foo=\)\(.*\)|\2new_bar|g"
foo=bar

sed应该以​​{{1​​}}替换bar。如何使用sed确定正确的backref编号,或者是否可以定义一个可选字段,否则可以使用组?

修改

实际上,我对第二种情况的描述是错误的,因为正则表达式不匹配,因为new_bar根本不在搜索字符串中。所以没有后向引用可以匹配。我错过了#的量词\?,无论该符号是否存在,它都会向实际群组产生。感谢@ruak指出这一点。

1 个答案:

答案 0 :(得分:1)

这有帮助吗?

sed "s|^\(#\?\)\(foo=\)\(.*\)|\2new_bar|g"

用你的字符串:

kent$  echo "#foo=bar" | sed "s|^\(#\?\)\(foo=\)\(.*\)|\2new_bar|g" 
foo=new_bar

kent$  echo "foo=bar" | sed "s|^\(#\?\)\(foo=\)\(.*\)|\2new_bar|g" 
foo=new_bar