【问题标题】:Sed seems to replace only the last occurrence in global string substitutionSed 似乎只替换了全局字符串替换中的最后一次出现
【发布时间】:2017-07-13 01:31:22
【问题描述】:

我使用这个命令,但它不是广告预期的工作:

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,但似乎只替换了最后一个匹配项。

【问题讨论】:

  • 标题说“awk”,但问题和标签是关于sed的。此外,“不工作”没有帮助——到底发生了什么?你的输出是什么?
  • 0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183suma400)
  • 只改变最后一部分

标签: sed regex-greedy


【解决方案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)

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


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

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

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多