2017-02-22 46 views
1

我使用这个命令的最后出现,但它不工作的广告意图:桑达似乎只替代全局字符串替换

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

+0

标题说“awk”,但问题和标签是关于sed。另外,“不工作”没有帮助 - 究竟发生了什么?你的输出是什么? –

+0

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

+0

只改变最后部分 – victorhernandezzero

回答

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的总是贪婪匹配,所以表达[^+]*代替.*,从而只能匹配到下一个+


注意你的企图没有只更换最后出现的指定图案,但 - 因为贪婪匹配 - 发现只有匹配跨越多个预期模式,它取代:从第一*文字的最后+文字的一切,并捕获组\1 theref -

\*\(.*\)+匹配*(106+400)+1*(1822+500)+1*(183+矿石扩大到(106+400)+1*(1822+500)+1*(183

+0

是的作品,谢谢你这么多 – victorhernandezzero