Vim命令删除除选定行外的所有行

6

我想要执行与之前相反的操作

:g/pattern/d

即删除文件中没有pattern的所有行。
3个回答

23
您可以使用 v 来选择所有不包含特定模式的行:
:v/pattern/d 可以实现您想要的效果。
请参见 :help :v

7
使用全局命令似乎比使用Shell命令更好,因为:(1)它是一个内部的Vim命令,不依赖于外部的grep实用程序,这可能会在Windows系统上出现问题;(2)虽然不确定,但由于Shell过滤器返回的基本上是一个全新的文档,而全局命令仅仅删除行,我认为全局命令更适合保持撤销历史记录更小(因此更快),(3)通常最好养成使用Vim全局命令(:g和:v)的习惯,因为它们让你在匹配行上执行任意操作,而不只是删除。 - Herbert Sitz

2
您可以简单地否定这个模式。
:g!/pattern/d

这将删除除选定行以外的所有内容。

2

一种方法是使用shell过滤器:

:%!grep pattern

这个命令将你的整个文件 (%) 传递给一个 shell (!),然后通过 grep pattern 命令运行它,并将输出返回到你的编辑器窗口。

2
尽管怀着敬意,Xavier T所提供的答案是正确的。Vim为这个确切的问题提供了:v命令。 - Jeffrey Jose
我同意。然而,Shell过滤功能本身非常有用。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接