Vim中的高级搜索技巧

7
有没有办法在Vim中同时搜索多个字符串?我记得在某个地方读到过这是可能的,但不知道具体技巧。
例如,我有一个文本文件,我想同时搜索“foo”和“bar”(不一定是作为单个字符串,可以在完全不同的行中)。
我该如何实现这个目标?
4个回答

15
/^joe.*fred.*bill/          : find joe AND fred AND Bill (Joe at start of line)
/fred\|joe                  : Search for FRED OR JOE

这也可以工作。而且比我下面给出的括号答案简单得多。 - AJ.
如果早些发现就好了... :( - ojblass

2

实际上,我在发布这篇文章后很快就找到了答案(是的,我之前确实使用谷歌搜索过,但无法找到。可能只是搜索错误)

正确的解决方案是

/(foo\|bar)

@Paul Betts:必须转义管道符


我认为在某些正则表达式方言中需要转义管道符,而在其他方言中则不需要。 - Steve Moyer
是的...我同意在vi中需要它,但字符的转义非常不一致,尝试直接复制该片段到另一个实现中必须小心进行。 - Steve Moyer
是的,这很不一致。我得检查一下,但我认为Vi不遵循PCRE(Perl兼容正则表达式),在那里我们就不必这样做。 - AJ.
你也需要转义括号(在vi(m)中)。而且有许多不同的正则表达式。Vim的正则表达式源自vi,而vi又源自ex。它对特殊字符的处理非常不一致,但你可以使用\v或\V来改变其行为。 - Zathrus
是的,就像 @Zathrus 说的那样。查看 :help magic 以获取更多信息,包括启用各种设置所需转义和不需要转义的表格。\v 表示“非常神奇”。 - Edward

0

Vim支持通过在命令模式下使用“/”来使用正则表达式。

因此,使用类似于“/(foo\|bar)”(如之前所述)的东西可以解决问题。了解为什么这样做以及你正在使用什么(正则表达式)是很好的。


-3
/(foo|bar)

1
默认情况下,您需要转义竖线和括号:/\(foo|bar\)。但无论如何,在这种情况下不需要将它们分组!/foo|bar。 - wilhelmtell

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