有没有一种方法可以计算文件中单词出现的次数?


Answers:


93

Quincy的答案很好,但是有一种确切的方法可以做到这一点,而无需编辑缓冲区:

:%s/pattern//ng

这将显示一条消息,如3 matches on 2 lines,并且不会对缓冲区进行任何更改。

n标志使:substitute命令打印匹配的数目,而不执行实际的替换;该g标志允许每行报告多个匹配项。


可能对您的用例有用的另一件事是打印与模式匹配的所有行:

:global/pattern/print

可以缩短为:

:g/pattern

这是:global命令最简单的用法之一(功能强大到令人难以置信)。它只会简单地打印出所有与匹配的行,pattern然后(如果有多行)您可以按Enter或键入另一个命令以使其消失。

一点琐事:该命令是名称的由来,grep通常将其描述为g/re/p,其中re代表“正则表达式”。


2
+1这是一个相当不错的答案,可以在现场进行,并且在同一时间进行详细介绍。希望大多数问题都能得到这样的答案!:)

很好的答案和惊人的琐事!
BiBi

我可能一年要这样做2-3次,而且永远都记不住语法了,所以每次都要写在搜索器上。只是想对这个清晰的答案表示感谢,因为它已经在我这里呆了不止一次,并且已经保存了几年,这使我陷入了糟糕的Wikia页面!(Wikia的,而不是页面的内容)
威尔

1
次要位:该命令g/re/p实际上来自ed,而不是vi。Grep比vi早了几年。
威尔

我有一个nnoremap <leader>n :%s///gn<CR>映射。因此,我按一下<leader>n以计算先前搜索的模式的出现。我经常使用它。
罗尔夫

15

:%s/pattern//n最后的n标志告诉:s命令报告匹配的数目,而不是实际替代。阅读:h :s_flags更多详细信息。


4
是不是gn
2015年

1
@yo'是的,尽管g只是另一个标志,但是g如果您觉得每行可能有多个匹配项,那么您也想使用它,这通常是正确的。但是,出于问题的目的,标记n更为重要。
Dhruva Sagar'2

5

首先用于/搜索正则表达式,然后

:%s///gn

这与Dhurva的答案相同,不同之处在于:a。易于使用(因为您可以预览正则表达式首先匹配的结果)和b。)与该g标志进行全局匹配以对所有事件进行计数。



2

:%s/pattern//g

您将在状态栏中看到替换数。那是pattern出现的次数。然后只需按u撤消替换。


1

我根据这里的答案将映射添加到.vimrc中:

" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>

" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>

有点解释,希望对新的vimmers有帮助:

  • <c-r><c-w> 在命令行中的光标下插入单词,在很多情况下都很方便。

  • <c-u>需要以除去自动插入'<,'> 按压时:在视觉模式和去命令行。该 *寄存器包含(最后一个)可视选择,<c-r>* 插入的内容*在命令行寄存器(也可以在插入模式中使用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.