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

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

我使用 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

并且我只希望留下提及 Dave 和 John 的事件——我可以使用什么 vim 命令来最终得到:

Dave came at 12PM
John ate lunch at 2PM
Dave left at 6PM

我知道我可以在 Windows 中使用 findstr 之类的命令行工具,在 *nix 中使用其他命令行工具,但我经常使用 vim,无法找到可以执行此操作的任何正则表达式或 vim 命令。谢谢!

答案1

您在问题中引用的命令:global实际上不只是接受文字字符串,它还可以处理任何正则表达式。因此,您只需提出一个具有两个分支的命令,一个用于 ,John一个用于Dave。瞧:

:g!/Dave\|John/d

请注意,这个简单的方法也会匹配Johnny;你可能希望将匹配限制为全部关键词

:g!/\<\(Dave\|John\)\>/d

正则表达式是 Vim 的一个强大功能;值得进一步了解。从 开始:help regular-expression

答案2

按照以下方法就可以了

:v/\v(Dave|John)/d

分解

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 

答案3

用这个:

:%s/^[^Dave|John].*\n//

意义:

%            means search the whole file
^            at the beginning of the line
[^Dave|John] something that isn't Dave nor John
.*           match anything
\n           new line character
//           replace with nothing

相关内容