SED似乎仅取代全球字符串替换中的最后一次发生



我使用此命令,但它不起作用的广告:

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

尝试以下内容:

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 +。/p>


请注意,您的尝试不仅替换了您的预期模式的最后出现,但是 - 由于贪婪的匹配 - 仅找到 1 匹配预定的模式,它取代了:

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

最新更新