如何在Vim中执行类似于“grep -w”的整词搜索。

68
如何在Vim中进行类似于grep -w的全字匹配搜索,仅返回包含所寻找字符串为整个单词而非单词的一部分的行? grep -w:仅选择包含形成整个单词的匹配项的行。
这可以在Vim中完成吗?
4个回答

83
\<bar\>

匹配 bar,但不包括 foobarbarbazfoobarbaz

用它来进行替换操作:

:s/\<bar\>/baz

按照以下方式使用它,以列出包含整个单词bar的所有行:

:g/\<bar\>

:h pattern 是一篇很好的阅读材料。


对于将 barfoobarbarbaz 进行匹配,可以使用 g*。根据文档:g* 类似于“*”,但不会在单词周围加上 "<" 和 ">"。这使得搜索还可以找到不是整个单词的匹配项。{在 Vi 中不可用} - Ambareesh
为什么有些字符在前缀为\时具有特殊行为,而有些字符在没有前缀为\时具有特殊行为? - mekb
2
@mekb,这与正则表达式的工作方式以及ASCII可用字符范围有关。一个模式可以是基本的,比如“匹配字符串abc”,也可以是复杂的,就像你能想到的任何东西一样。由于语法必须被限制为仅使用可打印的ASCII字符,并且所有这些字符都可能出现在原始文本中,也都可以被搜索,因此需要一种机制来将字符与元字符分开。<本身是一个字面上的<字符,可以匹配,但是如果前面加上\\,它就变成了一个元字符,表示“单词的开头”。 - romainl

33

您想要的是 /\<yourword\>

如果您的光标在一个单词上,那么您可以按下*键,它会对光标下的单词进行仅限于单词的搜索。


17

通过使用“非常魔法” \v,可以简化命令:

/\v<yourword>

正如评论中所提到的,\v 表示所有非字母数字字符都有特殊含义,因此只需要输入 <>,而不是使用 \<\> 进行转义。


1
根据vim维基,“使除了a-zA-Z0-9和'_'以外的每个后续字符都具有特殊含义”。这与整词搜索无关。 - Timo
1
@Timo,但这个答案与此有关。当然,作为评论可能会更好。 - tim-phillips
1
我同意这只是一个小点,可以作为评论,但普通用户更有可能阅读答案而不是评论,我发现\v是一种非常有用的方法,可以使命令简单明了。 - rnso

1
map w /\v<><Left>

这个映射使用了魔法,通过在"<"和">"之间移动光标位置来实现。一旦按下'w',您就可以立即输入要搜索的单词,并按Enter键执行整个单词搜索。

当然,您也可以选择自己喜欢的字母进行映射。


最好使用 \< \> - mekb
我从另一个问题中链接到了这个答案,并添加了一些额外的信息和注意事项。请参见:在vim中搜索整个单词 - 是否有其他方法而不是使用<> - Randall

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