我使用此命令,但它无法正常使用广告:
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 :(得分: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