Est-il possible de compter le nombre d'occurrences d'un mot dans un fichier?

68

Est-il possible de compter combien de fois un mot ou un motif apparaît dans un fichier? Ceci est parfois utile pour savoir combien de fois une fonction a été appelée, etc.

thameera
la source
:h count-items
Hotschke le

Réponses:

94

La réponse de Quincy est correcte, mais il existe un moyen exact de le faire qui ne nécessite pas l'édition du tampon:

:%s/pattern//ng

Cela imprimera un message comme 3 matches on 2 lines, et aucune modification ne sera apportée à votre tampon.

L' nindicateur fait en sorte que la :substitutecommande affiche le nombre de correspondances au lieu d'effectuer une substitution réelle; l' gindicateur permet de signaler plusieurs correspondances par ligne.


Une autre chose qui pourrait être utile à votre cas d'utilisation est d'imprimer toutes les lignes correspondant à un motif:

:global/pattern/print

qui peut être réduit à:

:g/pattern

C'est l'une des utilisations les plus simples de la :globalcommande (qui est incroyablement puissante). Il imprimera simplement toutes les lignes qui correspondent pattern, puis (s'il y a plus d'une ligne) vous appuyez Enterou tapez une autre commande pour la faire disparaître.

Un peu de trivia: Cette commande est l'origine du nom grep, comme il serait communément décrit comme g/re/p, où resignifie "expression régulière".

tommcdo
la source
2
+1 C'est une réponse plutôt agréable, sur le vif et raisonnablement détaillée en même temps. Espérons que la plupart des questions obtiennent de telles réponses! :)
Yo '
Grande réponse et trivia incroyable!
BiBi
Je dois le faire peut-être 2 à 3 fois par an et je ne me souviens jamais de la syntaxe, donc c'est à la machine de recherche à chaque fois. Je voulais juste vous remercier pour cette réponse claire, car elle m’a plus d’une fois été présente et m’a sauvé, depuis quelques années déjà, cette page de wikia horrible! (wikia, pas le contenu de la page)
Will
1
Bit mineur: la commande g/re/pest en réalité de ed, pas vi. Grep a précédé vi de quelques années.
Will
J'ai une nnoremap <leader>n :%s///gn<CR>cartographie. Je presse donc <leader>npour compter les occurrences du motif précédemment recherché. Je l'utilise étonnamment souvent.
Rolf
15

:%s/pattern//nLe ndrapeau à la fin indique à la :scommande de signaler le nombre de correspondances et non de la remplacer. Lire :h :s_flagspour plus de détails.

Dhruva Sagar
la source
4
N'est-ce pas gn?
Yo '
1
@yo 'Oui, bien que g soit juste un autre drapeau, vous voudrez gégalement l' utiliser si vous pensez qu'il peut y avoir plus d'une correspondance par ligne, ce qui est souvent le cas. Aux fins de la question, toutefois, le drapeau nest plus important.
Dhruva Sagar
5

Utilisez d'abord /pour rechercher une expression rationnelle, puis

:%s///gn

C'est la même chose que la réponse de Dhurva, sauf que c'est un.) Est plus facile à utiliser (puisque vous pouvez prévisualiser les résultats de ce que votre regex correspond en premier) et b.) Correspond de manière globale avec le gdrapeau pour compter toutes les occurrences.

Poignée de porte
la source
3

Grâce à ce PR https://github.com/vim/vim/pull/4317 , chaque commande de recherche affiche les statistiques de recherche (telles que la position du match en cours et le nombre de correspondances) dans vim 8.1.1270. Assurez-vous de supprimer Sde la variable shortmess.

Sven
la source
2

:%s/pattern//g

Vous verrez le nombre de substitutions dans la barre d'état. C'est combien de fois le patternapparaît. Ensuite, appuyez simplement sur upour annuler les substitutions.

Quincy Bowers
la source
1

Un mappage que j'ai ajouté à mon fichier .vimrc en fonction des réponses fournies ici:

" 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 peu d'explication, espérons-le utile pour les nouveaux vimmers:

  • <c-r><c-w> insère le mot sous le curseur dans la ligne de commande, pratique dans de nombreuses occasions.

  • Le <c-u>est nécessaire pour supprimer automatiquement l'inséré '<,'> lorsque vous appuyez sur :en mode visuel et passez à la ligne de commande. Le *registre contient la (dernière) sélection visuelle, <c-r>* insère le contenu du *registre dans la ligne de commande (peut également être utilisé en mode insertion).

Emile Vrijdags
la source