Ответ Куинси хорош, но есть точный способ сделать это, не требующий редактирования буфера:
:%s/pattern//ng
Это напечатает сообщение как 3 matches on 2 lines, и в ваш буфер не будет внесено никаких изменений.
nФлаг делает :substituteкоманду печать количества совпадений вместо выполнения фактической замены; gфлаг позволяет сообщать о нескольких матчей в каждой строке.
Еще одна вещь, которая может быть полезна для вашего варианта использования, это напечатать все строки, которые соответствуют шаблону:
:global/pattern/print
который можно сократить до:
:g/pattern
Это одно из самых простых применений :globalкоманды (которое невероятно мощно). Он просто распечатает все совпадающие строки pattern, а затем (если имеется более одной строки) вы нажимаете Enterили вводите другую команду, чтобы она исчезла.
Немного мелочей: эта команда является источником имени grep, как его обычно называют g/re/p, где reобозначает «регулярное выражение».
+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для более подробной информации.
@yo 'Да, хотя g - это просто еще один флаг, вы также можете использовать его, gесли считаете, что в каждой строке может быть несколько совпадений, что часто является правдой. Для цели вопроса, однако, флаг nявляется более важным.
Дхрува Сагар
5
Сначала используйте /для поиска регулярных выражений, затем
:%s///gn
Это то же самое, что и ответ Дхурвы, за исключением того, что он a.) Проще в использовании (так как вы можете предварительно просмотреть результаты того, что сначала соответствует вашему регулярному выражению) и b.) Глобально сопоставляется с gфлагом, чтобы подсчитать все вхождения.
Благодаря этому PR https://github.com/vim/vim/pull/4317 , каждая команда поиска показывает статистику поиска (например, текущее положение и количество совпадений) в vim 8.1.1270. Обязательно удалите Sиз переменной shortmess.
Сопоставление, которое я добавил в свой .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>*
вставляет содержимое *регистра в командной строке (также может быть использован в режиме вставки).
:h count-items
Ответы:
Ответ Куинси хорош, но есть точный способ сделать это, не требующий редактирования буфера:
Это напечатает сообщение как
3 matches on 2 lines
, и в ваш буфер не будет внесено никаких изменений.n
Флаг делает:substitute
команду печать количества совпадений вместо выполнения фактической замены;g
флаг позволяет сообщать о нескольких матчей в каждой строке.Еще одна вещь, которая может быть полезна для вашего варианта использования, это напечатать все строки, которые соответствуют шаблону:
который можно сократить до:
Это одно из самых простых применений
:global
команды (которое невероятно мощно). Он просто распечатает все совпадающие строкиpattern
, а затем (если имеется более одной строки) вы нажимаетеEnter
или вводите другую команду, чтобы она исчезла.Немного мелочей: эта команда является источником имени
grep
, как его обычно называютg/re/p
, гдеre
обозначает «регулярное выражение».источник
g/re/p
на самом деле изed
, а неvi
. Grep предшествует vi на пару лет.nnoremap <leader>n :%s///gn<CR>
отображение. Поэтому я нажимаю<leader>n
для подсчета вхождений ранее найденного шаблона. Я использую это на удивление часто.:%s/pattern//n
n
Флаг в конце говорит:s
команду , чтобы сообщить количество матчей и на самом деле не заменить. Читайте:h :s_flags
для более подробной информации.источник
gn
?g
если считаете, что в каждой строке может быть несколько совпадений, что часто является правдой. Для цели вопроса, однако, флагn
является более важным.Сначала используйте
/
для поиска регулярных выражений, затемЭто то же самое, что и ответ Дхурвы, за исключением того, что он a.) Проще в использовании (так как вы можете предварительно просмотреть результаты того, что сначала соответствует вашему регулярному выражению) и b.) Глобально сопоставляется с
g
флагом, чтобы подсчитать все вхождения.источник
Благодаря этому PR https://github.com/vim/vim/pull/4317 , каждая команда поиска показывает статистику поиска (например, текущее положение и количество совпадений) в vim 8.1.1270. Обязательно удалите
S
из переменнойshortmess
.источник
:%s/pattern//g
Вы увидите количество замен в строке состояния. Вот сколько раз
pattern
появляется. Затем просто нажмите,u
чтобы отменить замены.источник
Сопоставление, которое я добавил в свой .vimrc, основано на ответах здесь:
Немного объяснения, надеюсь, полезно для новых vimmers:
<c-r><c-w>
вставляет слово под курсором в командной строке, что удобно во многих случаях.<c-u>
Необходимо удалить автоматически вставляется'<,'>
при нажатии:
в визуальном режиме и собирается в командной строке.*
Регистр содержит (последний) визуальный выбор,<c-r>*
вставляет содержимое*
регистра в командной строке (также может быть использован в режиме вставки).источник