Rechercher une chaîne et obtenir le nombre dans l'éditeur vi

105

Je veux rechercher une chaîne et trouver le nombre d'occurrences dans un fichier à l'aide de l'éditeur vi.

Kadeshpa
la source
11
La réponse choisie ( :g/xxxx/d) est terrible, dangereuse et inférieure aux autres sur cette page. Veuillez le désélectionner.
Bruno Bronosky
1
Je suis d'accord et il ne vous dit que `` lignes supprimées '' et non `` occurrences supprimées ''
user1709076

Réponses:

4
:g/xxxx/d

Cela supprimera toutes les lignes avec le motif et indiquera le nombre de lignes supprimées. Annuler pour les récupérer après.

Kevin Beck
la source
6
Bien sûr, il peut simplement omettre le «d» pour ne pas avoir à se rendre à l'opération.
Tour du
15
Notez que cela vous indique seulement le nombre de lignes et non le nombre d'occurrences. Je pense que dirk est une meilleure solution.
4
Ma solution ci-dessous compte correctement plusieurs occurrences dans une ligne et il n'y a rien à annuler.
Mohit Chakraborty
6
Very Dangerous: o
Ankit Zalani
1
Ce n'est pas censé être la réponse acceptée / la plus populaire. Quels sont les modérateurs SO jusqu'à présent? :(
user1412066
181

LA façon est

:% s / modèle // gn

Gustavo
la source
2
C'est la réponse la plus authentique sans aucune astuce de sur-tuer.
user1412066
1
la meilleure réponse!
Paulo Luvisoto
121

Vous avez besoin du ndrapeau. Pour compter les mots, utilisez:

:%s/\i\+/&/gn   

et un mot particulier:

:%s/the/&/gn        

Voir la count-itemssection documentation.

Si vous tapez simplement:

%s/pattern/pattern/g

alors la ligne d'état vous donnera également le nombre de correspondances dans vi.

dirkgently
la source
Il semble que cette réponse soit pour les utilisateurs de Vim et non pour Vi :(
kadeshpa
Avez-vous uniquement vi sur votre système? Quelle version?
dirkgently
Quelqu'un a marqué votre question avec vim dedans ... Je l'ai supprimée.
ojblass
38

:% s / string / string / g donnera la réponse.

Mohit Chakraborty
la source
Quelle meilleure réponse. +5 si possible
ojblass
Je suppose que cela ne fonctionnerait que si aucun '. *' N'est utilisé dans le modèle
AK
10
Pas besoin de répéter la chaîne, faites-le %s/string//ng.
slm
23

(similaire à ce que dit Gustavo, mais en plus:)

Pour toute recherche antérieure , vous pouvez faire simplement:

:%s///gn

Un modèle n'est pas nécessaire, car il est déjà dans le registre de recherche ( @/).

"%" - faire s/dans tout le fichier
"g" - recherche globale (avec plusieurs résultats sur une ligne)
"n" - empêche tout remplacement de s/- rien n'est supprimé! rien ne doit être défait!
(voir: :help s_flagpour plus d'informations)

(De cette façon, cela fonctionne parfaitement avec " Rechercher du texte sélectionné visuellement ", comme décrit dans vim-wikia tip171 )

tron5
la source
3

utilisation

:% s / motif / \ 0 / g

lorsque la chaîne de motif est trop longue et que vous n'aimez pas tout taper à nouveau.

Sungwon Jeong
la source
1

Réponse courte :

:% s / chaîne à rechercher // gn

Pour apprendre :

Il y a 3 modes dans l'éditeur VI comme ci-dessous entrez la description de l'image ici

  • :vous entrez à partir Commandde Command-lineMode. Maintenant, tout ce que vous écrivez après :est sur CLI (Interface de ligne de commande)
  • %sspécifie toutes les lignes. Spécifier la plage comme %moyen d'effectuer une substitution dans tout le fichier. La syntaxe de la substitution de toutes les occurrences est:%s/old-text/new-text/g
  • gspécifie toutes les occurrences de la ligne. Avec le gdrapeau, vous pouvez faire remplacer toute la ligne. Si cet gindicateur n'est pas utilisé, seule la première occurrence de la ligne sera remplacée.
  • n spécifie le nombre d'occurrences de sortie
  • //la double barre oblique représente l'omission de replacement text. Parce que nous voulons juste trouver.

Une fois le nombre d'occurrences obtenu, vous pouvez appuyer sur la Ntouche pour voir les occurrences une par une.

Pour rechercher et compter dans une plage particulière du numéro de ligne 1 à 10:

: 1,10s / bonjour // gn

  • Veuillez noter %que le fichier entier est remplacé par ,des numéros de ligne séparés.

Pour rechercher et remplacer dans une plage particulière de ligne numéro 1 à 10:

: 1,10s / helo / bonjour / gn

Om Sao
la source
0

Je suggère de faire:

  1. Recherchez avec *pour faire une "recherche limitée" pour ce qui se trouve sous le curseur, ou effectuez une /patternrecherche standard .
  2. Utilisez :%s///gnpour obtenir le nombre d'occurrences. Ou vous pouvez utiliser :%s///npour obtenir le nombre de lignes avec des occurrences.

** J'ai vraiment pu trouver un plug-in qui donnerait un message de "match N de N 1 sur N 2 lignes" à chaque recherche, mais hélas.

Remarque: ne soyez pas confus par la formulation délicate de la sortie. La première commande pourrait vous donner quelque chose comme ce que 4 matches on 3 linesle second pourrait vous donner 3 matches on 3 lines. Bien que techniquement précis, ce dernier est trompeur et devrait dire «3 lignes correspondent». Ainsi, comme vous pouvez le voir, il n'est vraiment jamais nécessaire d'utiliser cette dernière forme («n» uniquement). Vous obtenez les mêmes informations, plus clairement, et plus encore en utilisant le formulaire «gn».

Bruno Bronosky
la source