用sed替换正则表达式组

时间:2014-02-05 15:01:56

标签: regex bash sed

我正在尝试替换(使用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'。

3 个答案:

答案 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=\'