使用 vim 删除除匹配任意一组字符串的行之外的所有行

Dav*_*ave 9 search vim regex string

我使用 vim 删除所有行,除了那些匹配特定字符串的行,例如

:g!/[我想保留在编辑器中的字符串]/d

效果很好。但我真正想要的,并且在任何地方都没有找到,是一种使用 vim 删除除多个字符串之外的所有字符串的方法。

例如,假设我打开了一个包含以下信息的文件:

Dave came at 12PM
Lucy came at 11AM
Trish came at 5PM
John ate lunch at 2PM
Virgil left at 3PM
Dave left at 6PM
Run Code Online (Sandbox Code Playgroud)

我只想留下提到 Dave 和 John 的事件——我可以使用什么 vim 命令来结束:

Dave came at 12PM
John ate lunch at 2PM
Dave left at 6PM
Run Code Online (Sandbox Code Playgroud)

我意识到我可以在 Windows 中使用像 findstr 这样的命令行工具,在 *nix 中使用其他工具,但是我经常使用 vim 并且无法使用任何可以执行此操作的正则表达式或 vim 命令。谢谢!

Ing*_*kat 15

:global您在问题中引用的命令实际上不仅采用文字字符串,还处理任何正则表达式。所以,你只需要想出一个有两个分支的,一个 for John,一个 for Dave。瞧:

:g!/Dave\|John/d
Run Code Online (Sandbox Code Playgroud)

请注意,这个简单的也将匹配Johnny; 您可能希望将匹配限制为整个关键字

:g!/\<\(Dave\|John\)\>/d
Run Code Online (Sandbox Code Playgroud)

正则表达式是 Vim 的一个强大功能;了解更多关于它们的信息是值得的。从 开始:help regular-expression

  • 那个,或者使用 `\v`“非常神奇”的修饰符,让你省略大多数反斜杠,如 Lieven Keersmaekers 的回答。 (2认同)

Lie*_*ers 6

以下应该这样做

:v/\v(Dave|John)/d
Run Code Online (Sandbox Code Playgroud)

分解

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 
Run Code Online (Sandbox Code Playgroud)