用sed替换正则表达式组

ale*_*nst 2 regex bash sed

我正在尝试替换(使用sed)与正则表达式匹配的组,但我能从测试中得到的最好的是一个字符串,它替换了sed分隔符右侧的整个字符串.

例:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
Run Code Online (Sandbox Code Playgroud)

输出:

this is a sample 421 string
Run Code Online (Sandbox Code Playgroud)

期望的输出:

this is a sample id='1' string
Run Code Online (Sandbox Code Playgroud)

这可能吗?怎么样?

编辑:

我要做的是实际上替换正则表达式匹配的组,而不是sed脚本左侧的整个字符串.换句话说:我想在不使用"id =''"的情况下将'42'替换为'1'.

Laj*_*res 7

也许是这样的?

$ echo "this is a sample id='42' string" | sed -r "s/id='.*?'/id='1'/g"
Run Code Online (Sandbox Code Playgroud)

结果:

这是一个示例id ='1'字符串

或者你可以这样做:

$ echo "this is a sample id='42' string" | sed -r "s/(id=')(.*?)(')/\11\3/g"
this is a sample id='1' string
Run Code Online (Sandbox Code Playgroud)

结果:

这是一个示例id ='1'字符串


Mad*_*ist 5

在 中sed整个左正则表达式被整个右正则表达式替换。如果您想保留左侧正则表达式的一部分,则必须将其显式复制到右侧或将其也设为捕获组:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
Run Code Online (Sandbox Code Playgroud)

将正确替换所有匹配项 , id='42'421因为\1is 42。如果您想保留显示 的部分id=...,则必须将其放入替换中:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/id='1'/g"
Run Code Online (Sandbox Code Playgroud)