Wie kann ich das Ergebnis eines Regex-Befehls im Vim-Normalmodus erfassen?

641
drapkin11

Ich möchte herausfinden, wie oft 'x' in meiner Datei vorhanden ist. Ich übermittle %s/x//gnund erhalte die richtige Antwort.

Wie kann ich die resultierende Zählung mithilfe von Vimscript in der Befehlszeile in einer Variablen erfassen?

Die folgende Lösung wurde durch eine Antwort unten angedeutet:

:let cnt=0 :g/x/let cnt=cnt+1 :echo cnt 

Jedoch cntwird die Gesamtzahl der Zeilen im Puffer zu speichern, die eine haben x, nicht, wie viele xs es in der gesamten Datei ist.

Die ursprüngliche Frage bleibt also bestehen.

2

3 Antworten auf die Frage

1
Heptite
In dem Link, über den Sie verfügen, wird der Befehl [: g] (http://vim.wikia.com/wiki/Power_of_g) erwähnt, mit dem ** Zeilen ** gezählt werden können, wo ein Regex übereinstimmt, nicht jedoch die Häufigkeit, mit der er übereinstimmt passt auf eine Zeile, was ich brauche. drapkin11 vor 13 Jahren 0
@ drapkin11: Guter Punkt. Ich weiß, dass es mit einem Vim-Skript möglich wäre, aber ich weiß nicht, wie man es eleganter macht. Heptite vor 13 Jahren 0
0
Rolnik

Sie können es versuchen

:let cnt=0 :g/^.*may/let cnt=cnt+1 :echo cnt 

Sie werden dann sehen, wie viele Zeilen mindestens einmal das Wort "may" enthalten. Der folgende Text wird also als 1 gezählt:

Your mileage may vary. You may have already won. 

Einfach.

Danke, aber das ist dem Vorschlag von @Heptite zu ähnlich, der meine ursprüngliche Frage nicht löst. Beachten Sie, dass ich * alle * Instanzen einer Übereinstimmung in jeder Zeile zählen muss - nicht nur eine. drapkin11 vor 13 Jahren 0
0
drapkin11

Folgendes tut den Trick:

:echo eval(join(map(range(1, line('$')), 'len(substitute(getline(v:val),"[^x]","","g"))')," + ")) 

Dies ersetzt alle Nichtzeichen xdurch nichts, zählt die Anzahl der verbleibenden Zeichen (sollte xs sein) und addiert dieses Ergebnis für jede Zeile in der Datei.

Ich hatte die Idee für diese Technik mit der mapFunktion von Dennis Williamson, in einem anderen Beitrag über Vim-Scripting.