我正在尝试替换(使用sed)与正则表达式匹配的组,但我能从测试中得到的最好的是一个字符串,它替换了sed分隔符右侧的整个字符串。
示例:
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
输出:
this is a sample 421 string
期望的输出:
this is a sample id='1' string
这可能吗?怎么样?
编辑:
我要做的是实际替换只是与正则表达式匹配的组,而不是sed脚本左侧的整个字符串。 换句话说:我想在不使用“id =''”的情况下将'42'替换为'1'。
答案 0 :(得分:5)
也许是这样的?
$ echo "this is a sample id='42' string" | sed -r "s/id='.*?'/id='1'/g"
结果:
这是一个示例id ='1'字符串
或者你可以这样做:
$ echo "this is a sample id='42' string" | sed -r "s/(id=')(.*?)(')/\11\3/g"
this is a sample id='1' string
结果:
这是一个示例id ='1'字符串
答案 1 :(得分:1)
在sed
中,整个左正则表达式由整个右正则表达式重新划分。如果您想保留左侧正则表达式的一部分,则必须将其明确复制到右侧或将其设为捕获组:
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
由于id='42'
为421
,会正确地将所有匹配\1
替换为42
。如果要保留标有id=...
的部分,则必须将其替换为替换:
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/id='1'/g"
答案 2 :(得分:0)
这是在awk
echo "this is a sample id='42' string" | awk -F\' '{$2=1}1' OFS=\'
this is a sample id='1' string
它确实使用'
作为字段分隔符,然后只替换字段#2中的值
这也应该有效:
awk -F\' '$2=1' OFS=\'