C'è un modo per contare il numero di occorrenze di una parola in un file?


68

È possibile contare quante volte appare una parola o un motivo in un file? Questo a volte è utile per scoprire quante volte è stata chiamata una funzione, ecc.


Risposte:


94

La risposta di Quincy va bene, ma esiste un modo esatto per farlo che non richiede la modifica del buffer:

:%s/pattern//ng

Questo stamperà un messaggio simile 3 matches on 2 linese non verranno apportate modifiche al buffer.

Il nflag fa sì che il :substitutecomando stampi il numero di corrispondenze anziché eseguire una sostituzione effettiva; il gflag consente di segnalare più corrispondenze per riga.


Un'altra cosa che potrebbe essere utile per il tuo caso d'uso è stampare tutte le linee che corrispondono a un motivo:

:global/pattern/print

che può essere abbreviato in:

:g/pattern

Questo è uno degli usi più semplici del :globalcomando (che è incredibilmente potente). Stamperà semplicemente tutte le righe corrispondenti pattern, quindi (se c'è più di una riga) premi Entero digiti un altro comando per farlo sparire.

Un po 'di curiosità: questo comando è l'origine del nome grep, come sarebbe comunemente descritto come g/re/p, dove resta per "espressione regolare".


2
+1 Questa è una risposta piuttosto piacevole, sul posto e ragionevolmente dettagliata allo stesso tempo. Speriamo che la maggior parte delle domande ottenga tali risposte! :)
yo'

Ottima risposta e curiosità straordinarie!
BiBi

Devo farlo forse 2-3 volte l'anno e non ricordo mai la sintassi, quindi è sempre alla macchina di ricerca. Volevo solo ringraziarti per questa chiara risposta perché è stato lì per me più di una volta e, da un paio d'anni, mi ha salvato quella terribile pagina di wiki! (wiki, non il contenuto della pagina)
Sarà il

1
Bit minore: il comando g/re/pviene effettivamente da ed, non vi. Grep precede Vi di un paio d'anni.
Sarà il

Ho una nnoremap <leader>n :%s///gn<CR>mappatura. Quindi premo <leader>nper contare le occorrenze del modello precedentemente cercato. Lo uso sorprendentemente spesso.
Rolf

15

:%s/pattern//nIl nflag alla fine indica :sal comando di segnalare il numero di corrispondenze e di non sostituirlo effettivamente. Leggi :h :s_flagsper maggiori dettagli.


4
No gn?
yo'

1
@yo 'Sì, anche se g è solo un'altra bandiera, ti consigliamo di utilizzare ganche se ritieni che ci possa essere più di una corrispondenza per riga, il che è spesso vero. Ai fini della domanda, tuttavia, la bandiera nè più importante.
Dhruva Sagar,

5

Prima usa /per cercare una regex, quindi

:%s///gn

Questa è la stessa della risposta di Dhurva, tranne per il fatto che a.) È più facile da usare (poiché puoi visualizzare in anteprima i risultati di ciò che corrisponde per primo al regex) e b.) Corrisponde a livello globale con la gbandiera per contare tutte le occorrenze.


3

Grazie a questo PR https://github.com/vim/vim/pull/4317 , ogni comando di ricerca mostra le statistiche di ricerca (come la posizione attuale della partita e il numero di partite) in vim 8.1.1270. Assicurati di rimuovere Sdalla variabile shortmess.


2

:%s/pattern//g

Vedrai il numero di sostituzioni nella barra di stato. Questo è quante volte patternappare. Quindi basta premere uper annullare le sostituzioni.


1

Una mappatura che ho aggiunto al mio .vimrc in base alle risposte qui:

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

Un po 'di spiegazione, si spera utile per i nuovi vimmers:

  • <c-r><c-w> inserisce la parola sotto il cursore nella riga di comando, utile in molte occasioni.

  • La <c-u>è necessario per rimuovere il inserito automaticamente '<,'> quando viene premuto :in modalità visiva e andare alla linea di comando. Il *registro contiene la (ultima) selezione visiva, <c-r>* inserisce il contenuto del *registro nella riga di comando (può essere utilizzato anche in modalità inserimento).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.