使用 sed 的可选组和 backref 计数

Optional group and backref counting with sed

我要在配置中交换 key/value 对的值,想知道当反向引用可以有不同的索引时如何在 sed 中完成此操作:

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

很好。但是,可能是注释符号不存在,所以第一组 (#) 不存在。 - 那么 \2 实际上就是 \1.

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

sed 应该以任何一种方式工作,用 new_bar 代替 bar。我如何使用 sed 确定正确的 backref 编号,或者是否可以定义一个可选字段,否则可以使用组?

编辑:

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

这有帮助吗?

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

用你的字符串:

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

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