使用 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
我要在配置中交换 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