Чи є спосіб підрахувати кількість зустрічей слова у файлі?


68

Чи можна порахувати, скільки разів слово чи візерунок з’являються у файлі? Іноді це корисно, щоб дізнатись, скільки разів була викликана функція тощо.


Відповіді:


93

Відповідь Квінсі чудова, але є точний спосіб зробити це, що не потребує редагування буфера:

:%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 Це досить приємна відповідь, на місці та одночасно досить детально. Будемо сподіватися, що більшість питань отримають такі відповіді! :)
yo '

Чудова відповідь та дивовижні дрібниці!
BiBi

Я маю це робити, можливо, 2-3 рази на рік і ніколи не пам’ятати синтаксис, тому щоразу до пошукової машини. Я просто хотів сказати спасибі за цю чітку відповідь, тому що вона була там для мене вже не один раз і вже пару років врятувала мені цю жахливу сторінку wikia! (Wikia, а не зміст сторінки)
Буде чи

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важливіший.
Dhruva Sagar

5

Спочатку скористайтеся /пошуком регулярного виразу

:%s///gn

Це те саме, що відповідь Дюрви, за винятком того, що він є а.) Простіший у використанні (оскільки ви можете попередньо переглянути результати того, що ваш регекс відповідає першим) та b.) В усьому світі відповідає gпрапорці, щоб підрахувати всі події.


3

Завдяки цьому PR https://github.com/vim/vim/pull/4317 кожна команда пошуку показує статистику пошуку (як поточна позиція матчу та кількість збігів) у vim 8.1.1270. Обов’язково видаліть Sзі змінної shortmess.


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>

Трохи пояснень, сподіваємось, корисні для нових виммерів:

  • <c-r><c-w> вставляє слово під курсором у командному рядку, зручно у багатьох випадках.

  • <c-u>Необхідно видалити автоматично вставляється '<,'> при натисканні :в візуальному режимі і збирається в командному рядку. *Регістр містить (останній) візуальний вибір, <c-r>* вставляє вміст *регістра в командному рядку (також може бути використаний в режимі вставки).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.