删除 Vim 中不包含单词的行

删除 Vim 中不包含单词的行

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

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

:s/^.*foo.*\n//

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

:s/^\(.*foo.*\)$/X\1/

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

:s/^[^X].*\n//

但是,难道没有更直接的方法,只需一次传递就可以完成此操作吗?我错过了什么?

答案1

这将删除所有不包含的行foo

:g/^\(.*foo\)\@!.*$/d

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

:v/\(foo\)/d

您可以阅读更多有关方式:g:v工作的信息这里

更多关于定义范围、使用元字符等进行搜索和替换的信息这里

答案2

好吧,如果你的目的只是删除带有文本的行,那么可以使用 awk 轻松完成,如下所示:

awk '/regex/{print}' filename

意思是 awk 将作用于文件名。您可以将其通过管道传输到新文件名或相同的文件名,如下所示 -

   awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename

相关内容