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.
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".
+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.
@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.
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.
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.
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).
:h count-items
Réponses:
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:
Cela imprimera un message comme
3 matches on 2 lines
, et aucune modification ne sera apportée à votre tampon.L'
n
indicateur fait en sorte que la:substitute
commande affiche le nombre de correspondances au lieu d'effectuer une substitution réelle; l'g
indicateur 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:
qui peut être réduit à:
C'est l'une des utilisations les plus simples de la
:global
commande (qui est incroyablement puissante). Il imprimera simplement toutes les lignes qui correspondentpattern
, puis (s'il y a plus d'une ligne) vous appuyezEnter
ou 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 commeg/re/p
, oùre
signifie "expression régulière".la source
g/re/p
est en réalité deed
, pasvi
. Grep a précédé vi de quelques années.nnoremap <leader>n :%s///gn<CR>
cartographie. Je presse donc<leader>n
pour compter les occurrences du motif précédemment recherché. Je l'utilise étonnamment souvent.:%s/pattern//n
Len
drapeau à la fin indique à la:s
commande de signaler le nombre de correspondances et non de la remplacer. Lire:h :s_flags
pour plus de détails.la source
gn
?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 drapeaun
est plus important.Utilisez d'abord
/
pour rechercher une expression rationnelle, puisC'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
g
drapeau pour compter toutes les occurrences.la source
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
S
de la variableshortmess
.la source
:%s/pattern//g
Vous verrez le nombre de substitutions dans la barre d'état. C'est combien de fois le
pattern
apparaît. Ensuite, appuyez simplement suru
pour annuler les substitutions.la source
Un mappage que j'ai ajouté à mon fichier .vimrc en fonction des réponses fournies ici:
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).la source