【问题标题】:Vim search and replace by decrementing back-reference?Vim 通过减少反向引用进行搜索和替换?
【发布时间】:2009-05-18 04:47:12
【问题描述】:

在 Vim 中给出以下文本:

[2] [3] [4]

我想执行搜索和替换并生成以下内容:

[1] [2] [3]

我知道如何通过搜索和替换使用反向引用来提取数字:

:%s/\[\(\d\)\]/[\1]/g

但现在的问题是如何减少 \1 的值。

有什么想法吗?

【问题讨论】:

    标签: regex vim replace


    【解决方案1】:

    试试

    :%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g
    

    编辑:我在\d 之后添加了一个\+,以防您想匹配多个数字。

    :help sub-replace-special

    【讨论】:

    • 太棒了!你知道在搜索和替换中使用 \= 有什么好的文档吗?
    • 试试 :help sub-replace-expression
    【解决方案2】:

    当您使用\zs\ze 锚定括号内的数字而不匹配它们时,替换变得更简单,因为您不需要在替换中连接:

    :%s/\[\zs\d\+\ze]/\=submatch(0)-1/g
    

    【讨论】:

      【解决方案3】:

      试试这个:

      %s:\d:\r&\r:g
      

      然后

      s/\d/\=submatch(0)-1/
      

      现在你需要加入这些行。

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 2015-02-15
        • 1970-01-01
        • 2011-06-15
        • 2011-02-20
        • 2011-05-04
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        相关资源
        最近更新 更多