删除 Vim 中不包含单词的行

hip*_*ail 2 vim regex find-and-replace

在 Vim 中,我经常发现我只对包含特定文本字符串的行感兴趣,并想删除所有其他行。

匹配包含字符串的行很容易:

:s/^.*foo.*\n//
Run Code Online (Sandbox Code Playgroud)

我通常最终做的是两次传递,一次用特殊的第一个字符“标记”我想要的所有行:

:s/^\(.*foo.*\)$/X\1/
Run Code Online (Sandbox Code Playgroud)

在第二遍中,很容易对固定位置的一个字符进行否定匹配,因此我删除了所有没有字符串的行,因此:

:s/^[^X].*\n//
Run Code Online (Sandbox Code Playgroud)

但是,难道没有一种更直接的方法可以通过一次传递来做到这一点吗?我错过了什么?

abh*_*kdz 9

这将删除所有不包含foo.

:g/^\(.*foo\)\@!.*$/d
Run Code Online (Sandbox Code Playgroud)

相反,您还可以使用:v来反转搜索模式的意义。

:v/\(foo\)/d
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于方式:g:v工作的信息

而更多的定义范围,使用元字符等,为搜索和替换在这里