搜索并删除多行

时间:2010-01-15 07:45:46

标签: search vim

在vim

  

:g / George Bush / d

删除 George Bush的所有行。

如果我想删除以乔治布什 开头的 5行,该怎么办?

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

3 个答案:

答案 0 :(得分:96)

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

删除所有与“乔治布什”匹配的行:

:g/George Bush/ d

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

:g/George Bush/ .+5 d

删除DEBUG日志条目:

:g/DEBUG/ .,+10 d

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

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

您还可以在与以下内容不匹配的每一行上执行命令:g!。例如在不包含“糟透了”这个词的每一行上用“奥巴马”取代“布什”:

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

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

 :g/TODO

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

您可以使用“|”链接多个命令。例如在不包含“糟透了”的每条线路上将布什改为奥巴马和乔治改为巴拉克:

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

答案 1 :(得分:11)

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

要删除带有图案的当前行以及下面的2行以上 :g/XXX/d+3

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

答案 2 :(得分:5)

:g/George Bush/d 6