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
我使用这个命令,但它没有正常工作:
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