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)
但是,难道没有一种更直接的方法可以通过一次传递来做到这一点吗?我错过了什么?
这将删除所有不包含foo
.
:g/^\(.*foo\)\@!.*$/d
Run Code Online (Sandbox Code Playgroud)
相反,您还可以使用:v
来反转搜索模式的意义。
:v/\(foo\)/d
Run Code Online (Sandbox Code Playgroud)
而更多的定义范围,使用元字符等,为搜索和替换在这里。