使用Vim将所有*非*匹配的字符串替换为另一个字符串

13

解析日志文件时,我经常使用:g!/<string I want to keep in the log>/d命令来删除日志中不包含感兴趣字符串的所有行。 现在,我想使用这个强大的命令将所有不匹配的字符串替换为空行。

除了已经使用过的命令和格式为:g!/<match string>/<cmd>(其中cmd是vim中使用的“ex命令”之一)外,我几乎没有找到有关:g!的任何信息。

因此,我认为可以使用s命令来完成这项任务,但我对这个领域的理解有限。有人能建议如何正确格式化命令吗?或者是否有其他更适合此任务的工具? (sed / awk?我从未真正使用过它们,但知道它们非常强大。)

另一个选择是撤退并编写一个Python实用程序来完成它。

2个回答

20
首先,您可以使用:v作为:g!的快捷方式。我认为来源于标准grep命令的-v选项的词源学。

是的,您可以使用任何ex命令,包括:s。默认情况下,:s仅作用于单行;将其与:g(或:g!:v)组合使用,您可以选择要处理的行。如果我理解正确,那么

:v/<string I want to keep>/s/.*//

这正是你想要的。您可能需要跟进使用:noh

补充:我对这个简短的答案如此受欢迎感到有些惊讶。有趣的是文档(:help :g然后向下滚动一点)提到:%s/pat/PAT/g作为:g/pat/s//PAT/g的替代方案(“两个字符更短!”)。我认为这意味着:g/pat/s/过去比:%s/pat/更常见。

无耻地插入广告:如果您想了解有关:g:s的更多信息,您可能还会对我在vim中为什么:%s/^ $ // g不等于:g /^$/ d的答案?


:v/regex/norm! 0D 是一种替代方法。 - Conner
另外,:v/regex/pu_|-d - Conner

1
在Linux上,您可能更喜欢:
:%!grep STRING_YOU_WANT_TO_KEEP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接