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

时间:2017-02-22 19:53:34

标签: sed regex-greedy

我使用此命令,但它无法正常使用广告:

echo "0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183+400)" | sed 's/\*\(.*\)+/*\1suma/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,但看起来只有最后一次出现被替换。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

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

产生:

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

诀窍是避免sed总是贪婪匹配,因此使用表达式[^+]*代替.*,以便只匹配到 next +

请注意,您的尝试不仅会替换目标模式的 last ,而且 - 由于贪婪的匹配 - 只发现 1 匹配跨越多个它取代的预期模式:

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