在 Vim 中,我经常发现我只对包含特定字符串的行感兴趣,而想要删除所有其他行。
匹配包含字符串的行很容易:
:s/^.*foo.*\n//
我通常最终会进行两次传递,一次用特殊的第一个字符“标记”我想要的所有行:
:s/^\(.*foo.*\)$/X\1/
在第二遍中,很容易对固定位置的一个字符进行负匹配,因此我删除了所有没有字符串的行:
:s/^[^X].*\n//
但是,难道没有更直接的方法,只需一次传递就可以完成此操作吗?我错过了什么?
答案1
答案2
好吧,如果你的目的只是删除带有文本的行,那么可以使用 awk 轻松完成,如下所示:
awk '/regex/{print}' filename
意思是 awk 将作用于文件名。您可以将其通过管道传输到新文件名或相同的文件名,如下所示 -
awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename