【问题标题】:vim: how to use a match from a global command in a range following the matchvim:如何在匹配后的范围内使用来自全局命令的匹配
【发布时间】:2016-12-07 13:17:24
【问题描述】:

在以下文本行中,我想将全局命令搜索中的匹配文本添加到全局命令之后指定的范围

所以要从中得到

Number 1
  indentA
  indentB
Number 2
  indentC
  indentD

到这里

Number 1
  1 indentA
  1 indentB
Number 2
  2 indentC
  2 indentD

不久前我看到了一个类似的问题和答案,但我一生都找不到它。以下是我失败的尝试之一。我理解它为什么不起作用,但不知道如何更改它以使其起作用。

:g/\d$/+1,+2s/indent/\=submatch(0).'indent'

【问题讨论】:

    标签: regex vim replace range match


    【解决方案1】:

    解决方案

    :g/\d$/execute '+1,+2s/indent/' . matchstr(getline('.'), '\d$') . ' &'
    

    说明

    在您的尝试中,submatch() 已经引用了 :s 处理的以下行。 :g/:s组合有两个作用域,需要在:g的作用域内抓取数字:

    :g/\d$/echo matchstr(getline('.'), '\d$')
    

    现在,我们可以将数字传递到第二阶段,:s。可以:let 一个变量,并使用:help sub-replace-expr 评估它(如您的尝试),但:execute 更容易,尤其是对于不需要任何形式的转义的数字:

    :execute '+1,+2s/indent/' . theNumber . ' &'
    

    为避免重复搜索,& 在这里很方便。 's/\zeindent/' . theNumber . ' /' 也可以。

    【讨论】:

      【解决方案2】:

      您的解决方案不起作用,因为submatch() 将引用:s 命令而不是:g。您可以在 :s 中使用表达式来获取 再次编号,但这似乎有点重复,与第二个匹配 次。使用indent 和搜索可能是一个更简单的逻辑 向后一个数字:

      :g/indent/s/\</\=getline(search('\d$', 'b'))[-1:].' ' 
      

      在此命令中,第一个单词 (\&lt;) 的开头包含 indent 替换为上一行的最后一个字符 ([-1:]) ('b') 包含一个数字作为最后一个字符,后跟一个空格 (.' ')。

      但是,特别是在您的示例中,每行只有一位数字 所以你不需要捕获以数字结尾的前一行。你 可以简单地捕捉上一行出现的数字(独立 如果它是 Numberindent 行。然后,这不需要:g 命令,因为它是正则表达式的简单工作:

      :%s/\v(\d).*\n\s+\zs/\1 
      

      【讨论】:

      • \&lt; 对我来说是新的,我不得不分解替代命令以了解为什么使用 \zs。谢谢sidyll,它表明有很多方法可以给猫剥皮。郁闷的是我找不到他们中的任何一个
      • 谢谢@LievenKeersmaekers。对不起,我应该更好地解释正则表达式。不过,我很高兴你找到了解决方法。 Vim 正则表达式非常强大,比 Perl 更强大!通常它会自己解决问题(不需要其他命令)。
      • @LievenKeersmaekers 是的,有很多方法可以做到这一点,但不要为此感到难过。解决问题涉及识别模式,您只能识别您知道的东西(在英语中几乎没有意义,但是 herkennen / kennen)。虽然我知道你不知道的 4 件事(\&lt;\&gt;\zs\ze),但你肯定知道很多我不知道的事情。这种信息交流使它变得有趣。现在您已经掌握了这些新工具,并且已经认识到它们在解决未来问题方面的实用性:D
      • 你肯定知道很多事情......:mogelijk maar 'k zou er toch niet te veel op verwedden hoor ;)。
      猜你喜欢
      • 2011-12-15
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多