Sed 似乎只替换了全局字符串替换中的最后一次出现

Sed seems to replace only the last occurrence in global string substitution

我使用这个命令,但它没有正常工作:

echo "0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183+400)" | sed 's/\*\(.*\)+/*suma/g'

这是预期的输出:

0+223+141+800+450+1*(106suma400)+1*(1822suma500)+1*(183suma400)

但这就是我得到的:

0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183suma400)

尽管使用了 g

,但看起来只有最后一次被替换了

尝试以下操作:

echo "0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183+400)" |
    sed 's/\(\*([^+]*\)+/suma/g'

产生:

0+223+141+800+450+1*(106suma400)+1*(1822suma500)+1*(183suma400)

的诀窍是避免sed总是贪心匹配,所以使用表达式[^+]*代替.*,这样仅匹配 下一个 +.


请注意,您的尝试不仅替换了预期模式的 last 次出现,而且 - 由于贪婪匹配 - 仅找到 1 匹配跨越 多个 预期模式,它替换了:

\*\(.*\)+ 匹配 *(106+400)+1*(1822+500)+1*(183+ - 从第一个 * 文字到 最后一个 + 文字和捕获组的所有内容</code> 因此扩展为 <code>(106+400)+1*(1822+500)+1*(183