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


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”.


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.


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.


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.


2

:%s/pattern//g

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


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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.