Есть ли способ подсчитать количество вхождений слова в файл?

68

Можно ли посчитать, сколько раз слово или шаблон появляется в файле? Иногда полезно узнать, сколько раз была вызвана функция и т. Д.

thameera
источник
:h count-items
Хотчке

Ответы:

94

Ответ Куинси хорош, но есть точный способ сделать это, не требующий редактирования буфера:

:%s/pattern//ng

Это напечатает сообщение как 3 matches on 2 lines, и в ваш буфер не будет внесено никаких изменений.

nФлаг делает :substituteкоманду печать количества совпадений вместо выполнения фактической замены; gфлаг позволяет сообщать о нескольких матчей в каждой строке.


Еще одна вещь, которая может быть полезна для вашего варианта использования, это напечатать все строки, которые соответствуют шаблону:

:global/pattern/print

который можно сократить до:

:g/pattern

Это одно из самых простых применений :globalкоманды (которое невероятно мощно). Он просто распечатает все совпадающие строки pattern, а затем (если имеется более одной строки) вы нажимаете Enterили вводите другую команду, чтобы она исчезла.

Немного мелочей: эта команда является источником имени grep, как его обычно называют g/re/p, где reобозначает «регулярное выражение».

tommcdo
источник
2
+1 Это довольно хороший ответ, на месте и в то же время достаточно подробный. Будем надеяться, что большинство вопросов получат такие ответы! :)
йо»
Отличный ответ и удивительные мелочи!
БиБи
Я должен делать это, может быть, 2-3 раза в год и никогда не вспоминать синтаксис, так что это каждый раз для поисковой машины. Я просто хотел поблагодарить вас за этот четкий ответ, потому что он был там для меня не раз и уже пару лет спас мне эту ужасную вики-страницу! (Викия, а не содержимое страницы)
Будет ли
1
Незначительный бит: команда g/re/pна самом деле из ed, а не vi. Grep предшествует vi на пару лет.
Будет ли
У меня есть nnoremap <leader>n :%s///gn<CR>отображение. Поэтому я нажимаю <leader>nдля подсчета вхождений ранее найденного шаблона. Я использую это на удивление часто.
Рольф
15

:%s/pattern//nnФлаг в конце говорит :sкоманду , чтобы сообщить количество матчей и на самом деле не заменить. Читайте :h :s_flagsдля более подробной информации.

Дхрува Сагар
источник
4
Не так ли gn?
лет»
1
@yo 'Да, хотя g - это просто еще один флаг, вы также можете использовать его, gесли считаете, что в каждой строке может быть несколько совпадений, что часто является правдой. Для цели вопроса, однако, флаг nявляется более важным.
Дхрува Сагар
5

Сначала используйте /для поиска регулярных выражений, затем

:%s///gn

Это то же самое, что и ответ Дхурвы, за исключением того, что он a.) Проще в использовании (так как вы можете предварительно просмотреть результаты того, что сначала соответствует вашему регулярному выражению) и b.) Глобально сопоставляется с gфлагом, чтобы подсчитать все вхождения.

Дверная ручка
источник
3

Благодаря этому PR https://github.com/vim/vim/pull/4317 , каждая команда поиска показывает статистику поиска (например, текущее положение и количество совпадений) в vim 8.1.1270. Обязательно удалите Sиз переменной shortmess.

Sven
источник
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>* вставляет содержимое *регистра в командной строке (также может быть использован в режиме вставки).

Эмиль Врейдагс
источник