【问题标题】:Search and delete multiple lines搜索和删除多行
【发布时间】:2011-01-05 10:07:00
【问题描述】:

在 vim 中

:g/乔治·布什/d

删除所有与 George Bush 相关的行。

如果我想删除 下面以 George Bush 开头的 5 行,该怎么办?

另一个现实的例子是在 log4net 日志中找到所有 DEBUG 并删除直到堆栈跟踪的末尾(我知道它将在它下面的另外 10 行)

【问题讨论】:

    标签: search vim


    【解决方案1】:

    :global 命令是你的朋友——好好学习吧。它允许您在匹配正则表达式的每一行上运行任意 :ex 命令。它缩写为:g。

    删除所有匹配“George Bush”的行:

    :g/George Bush/ d
    

    后面的命令可以有自己的地址/范围前缀,这将与匹配的行相关。所以删除乔治布什之后的第 5 行:

    :g/George Bush/ .+5 d
    

    删除调试日志条目:

    :g/DEBUG/ .,+10 d
    

    如果您知道堆栈跟踪是可变长度的,但总是以空行(或其他正则表达式)结束:

    :g/DEBUG/ .,/^$/ d
    

    您还可以在与 :g! 不匹配的每一行上执行命令。例如在不包含单词“sucks”的每一行上用“Obama”替换“Bush”:

     :g!/sucks/ s/Bush/Obama/
    

    默认命令是将行打印到消息窗口。例如列出标记为 TODO 的每一行:

     :g/TODO
    

    这对于在执行破坏性操作之前检查正则表达式是否与您期望的行匹配也很有用。

    您可以使用“|”链接多个命令。例如在不包含“sucks”的每一行中将 Bush 更改为 Obama 并将 George 更改为 Barack:

     :g!/sucks/ s/Bush/Obama/g | s/George/Barack/g
    

    【讨论】:

      【解决方案2】:

      删除模式下的 3 行,例如XXX
      :g/XXX/+d3

      删除带有模式的当前行以及下面的另外 2 行
      :g/XXX/d+3

      注意:使用“-”表示模式上方的操作。

      【讨论】:

        【解决方案3】:

        :g/George Bush/d 6

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多