Czy istnieje sposób na policzenie liczby wystąpień słowa w pliku?

68

Czy można policzyć, ile razy słowo lub wzór pojawia się w pliku? Czasami jest to przydatne, aby dowiedzieć się, ile razy została wywołana funkcja itp.

Thameera
źródło
:h count-items
Hotschke

Odpowiedzi:

93

Odpowiedź Quincy jest w porządku, ale jest na to dokładny sposób, który nie wymaga edycji bufora:

:%s/pattern//ng

Spowoduje to wydrukowanie komunikatu typu 3 matches on 2 linesi żadne zmiany nie zostaną wprowadzone w buforze.

nFlaga powoduje, że :substitutepolecenie wydrukowania liczbę meczów zamiast wykonywania rzeczywistej zmiany; gflaga umożliwia raportowanie wielu meczów na linie.


Inną rzeczą, która może być przydatna w twoim przypadku użycia, jest wydrukowanie wszystkich linii pasujących do wzoru:

:global/pattern/print

które można skrócić do:

:g/pattern

Jest to jedno z najprostszych zastosowań :globalpolecenia (które jest zadziwiająco potężne). Po prostu wydrukuje wszystkie pasujące linie pattern, a następnie (jeśli jest więcej niż jedna linia) naciśniesz Enterlub wpisz inne polecenie, aby zniknęło.

Trochę ciekawostek: to polecenie jest początkiem nazwy grep, jak to bywa powszechnie określane jako g/re/p, gdzie reoznacza „wyrażenie regularne”.

tommcdo
źródło
2
+1 To dość miła odpowiedź, na miejscu i jednocześnie dość szczegółowa. Miejmy nadzieję, że większość pytań uzyska takie odpowiedzi! :)
yo '
Świetna odpowiedź i niesamowite ciekawostki!
BiBi
Muszę to robić może 2-3 razy w roku i nigdy nie pamiętam składni, więc za każdym razem jest to wyszukiwarka. Chciałem tylko podziękować za tę jasną odpowiedź, ponieważ była tam dla mnie więcej niż raz i od kilku lat uratowała mi tę okropną stronę wiki! (wikia, nie treść strony)
Czy
1
Drobny bit: polecenie g/re/ppochodzi w rzeczywistości ed, a nie vi. Grep wyprzedza vi o kilka lat.
Czy
Mam nnoremap <leader>n :%s///gn<CR>mapowanie. Naciskam więc, <leader>naby policzyć wystąpienia poprzednio wyszukiwanego wzoru. Używam tego zaskakująco często.
Rolf
15

:%s/pattern//nnFlag w końcu mówi :skomendę zgłosić liczbę meczów, a nie faktycznie zastąpić. Czytaj :h :s_flagswięcej informacji.

Dhruva Sagar
źródło
4
Nie jest to gn?
yo „
1
@yo 'Tak, chociaż g to tylko kolejna flaga, warto też użyć tej opcji, gjeśli uważasz, że może występować więcej niż jeden mecz na linię, co często jest prawdą. Dla celów pytania flaga njest jednak ważniejsza.
Dhruva Sagar
5

Najpierw użyj, /aby wyszukać wyrażenie regularne, a następnie

:%s///gn

Jest to to samo, co odpowiedź Dhurvy, z tą różnicą, że a.) Jest łatwiejsza w użyciu (ponieważ możesz wyświetlić podgląd wyników tego, co pasuje do wyrażenia regularnego jako pierwsza) i b.) Dopasowuje się globalnie z gflagą, aby zliczyć wszystkie wystąpienia.

Klamka
źródło
3

Dzięki temu PR https://github.com/vim/vim/pull/4317 każde polecenie wyszukiwania pokazuje statystyki wyszukiwania (takie jak aktualna pozycja dopasowania i liczba dopasowań) w vimie 8.1.1270. Pamiętaj o usunięciu Sze zmiennej shortmess.

Sven
źródło
2

:%s/pattern//g

Zobaczysz liczbę zmian na pasku stanu. Tak wiele razy się patternpojawia. Następnie wystarczy nacisnąć, uaby cofnąć zamiany.

Quincy Bowers
źródło
1

Mapowanie, które dodałem do mojego .vimrc na podstawie odpowiedzi tutaj:

" 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>

Trochę wyjaśnienia, miejmy nadzieję, pomocne dla nowszych vimerów:

  • <c-r><c-w> wstawia słowo pod kursorem w linii poleceń, przydatne przy wielu okazjach.

  • Jest <c-u>to konieczne, aby usunąć automatycznie wstawiony '<,'> po naciśnięciu :w trybie wizualnym i przejściu do wiersza poleceń. *Rejestr zawiera (ostatnie) wybór wizualnego, <c-r>* wstawia zawartość *rejestru w wierszu poleceń (może być również stosowany w trybie wstawiania).

Emile Vrijdags
źródło