![使用 vim 删除除与任意一组字符串匹配的行之外的所有行](https://linux22.com/image/1409376/%E4%BD%BF%E7%94%A8%20vim%20%E5%88%A0%E9%99%A4%E9%99%A4%E4%B8%8E%E4%BB%BB%E6%84%8F%E4%B8%80%E7%BB%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
我使用 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