Gibt es eine Möglichkeit, die Anzahl der Vorkommen eines Wortes in einer Datei zu zählen?
68
Kann man zählen, wie oft ein Wort oder ein Muster in einer Datei vorkommt? Dies ist manchmal nützlich, um herauszufinden, wie oft eine Funktion usw. aufgerufen wurde.
Die Antwort von Quincy ist in Ordnung, aber es gibt einen genauen Weg, der keine Bearbeitung des Puffers erfordert:
:%s/pattern//ng
Dadurch wird eine Nachricht wie folgt gedruckt 3 matches on 2 lines, und es werden keine Änderungen an Ihrem Puffer vorgenommen.
Das nFlag bewirkt, dass der :substituteBefehl die Anzahl der Übereinstimmungen ausgibt, anstatt eine tatsächliche Ersetzung durchzuführen. Das gFlag ermöglicht die Meldung mehrerer Übereinstimmungen pro Zeile.
Eine weitere nützliche Funktion für Ihren Anwendungsfall ist das Drucken aller Zeilen, die einem Muster entsprechen:
:global/pattern/print
was sich verkürzen lässt auf:
:g/pattern
Dies ist eine der einfachsten Anwendungen des :globalBefehls (der unglaublich mächtig ist). Es werden einfach alle übereinstimmenden Zeilen gedruckt pattern, und dann (wenn es mehr als eine Zeile gibt) drücken Sie Enteroder geben Sie einen anderen Befehl ein, damit er verschwindet.
Ein bisschen Trivia: Dieser Befehl ist der Ursprung des Namens grep, wie es allgemein beschrieben werden würde g/re/p, wo refür „reguläre Ausdrücke“ steht.
+1 Dies ist eine ziemlich nette Antwort, direkt vor Ort und relativ detailliert zur gleichen Zeit. Hoffen wir, dass die meisten Fragen solche Antworten bekommen! :)
yo '
Tolle Antwort und erstaunliche Wissenswertes!
BiBi
Ich muss das vielleicht 2-3 mal im Jahr machen und erinnere mich nie an die Syntax, damit es jedes Mal für die Suchmaschine gilt. Ich wollte mich nur für diese klare Antwort bedanken, weil sie mehr als einmal für mich da war und mir seit ein paar Jahren diese schreckliche Wikia-Seite erspart hat! (Wikia, nicht der Inhalt der Seite)
Will
1
Kleines bisschen: Der Befehl g/re/pkommt eigentlich von ed, nicht vi. Grep ist ein paar Jahre älter als vi.
Wird
Ich habe eine nnoremap <leader>n :%s///gn<CR>Zuordnung. Also drücke ich, <leader>num die Vorkommen des zuvor gesuchten Musters zu zählen. Ich benutze das überraschend oft.
Rolf
15
:%s/pattern//nDas nFlag am Ende weist den :sBefehl an, die Anzahl der Übereinstimmungen zu melden und nicht zu ersetzen. Lesen Sie :h :s_flagsfür weitere Details.
@yo 'Ja, obwohl g nur ein weiteres Flag ist, möchten Sie es auch verwenden, gwenn Sie der Meinung sind, dass es mehr als eine Übereinstimmung pro Zeile gibt, was häufig zutrifft. Für die Fragestellung ist jedoch die Flagge nwichtiger.
Dhruva Sagar
5
Verwenden Sie zuerst /, um nach einem regulären Ausdruck zu suchen
:%s///gn
Dies ist die gleiche Antwort wie bei Dhurva, mit der Ausnahme, dass es a.) Einfacher zu verwenden ist (da Sie eine Vorschau der Ergebnisse dessen anzeigen können, womit Ihre Regex zuerst übereinstimmt) und b.) Global mit dem gFlag übereinstimmt, um alle Vorkommen zu zählen .
Dank dieser PR https://github.com/vim/vim/pull/4317 zeigt jeder Suchbefehl Suchstatistiken (wie die aktuelle Match-Position und die Anzahl der Matches) in Version 8.1.1270 an. Stellen Sie sicher, dass Sie Sdie Variable entfernen shortmess.
Sie sehen die Anzahl der Ersetzungen in der Statusleiste. So oft patternerscheint das. Drücken Sie dann einfach u, um die Ersetzungen rückgängig zu machen.
Eine Zuordnung, die ich zu meiner .vimrc-Datei hinzugefügt habe, basierend auf den folgenden Antworten:
" 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>
Ein bisschen Erklärung, hoffentlich hilfreich für neuere Vimmer:
<c-r><c-w> fügt das Wort unter dem Cursor in die Befehlszeile ein, was in vielen Fällen nützlich ist.
Das <c-u>wird benötigt, um das automatisch eingefügte zu entfernen, '<,'>
wenn Sie :im visuellen Modus drücken und zur Befehlszeile gehen. Das
*Register enthält die (letzte) visuelle Auswahl, <c-r>*
fügt den Inhalt des *Registers in die Befehlszeile ein (kann auch im Einfügemodus verwendet werden).
:h count-items
Antworten:
Die Antwort von Quincy ist in Ordnung, aber es gibt einen genauen Weg, der keine Bearbeitung des Puffers erfordert:
Dadurch wird eine Nachricht wie folgt gedruckt
3 matches on 2 lines
, und es werden keine Änderungen an Ihrem Puffer vorgenommen.Das
n
Flag bewirkt, dass der:substitute
Befehl die Anzahl der Übereinstimmungen ausgibt, anstatt eine tatsächliche Ersetzung durchzuführen. Dasg
Flag ermöglicht die Meldung mehrerer Übereinstimmungen pro Zeile.Eine weitere nützliche Funktion für Ihren Anwendungsfall ist das Drucken aller Zeilen, die einem Muster entsprechen:
was sich verkürzen lässt auf:
Dies ist eine der einfachsten Anwendungen des
:global
Befehls (der unglaublich mächtig ist). Es werden einfach alle übereinstimmenden Zeilen gedrucktpattern
, und dann (wenn es mehr als eine Zeile gibt) drücken SieEnter
oder geben Sie einen anderen Befehl ein, damit er verschwindet.Ein bisschen Trivia: Dieser Befehl ist der Ursprung des Namens
grep
, wie es allgemein beschrieben werden würdeg/re/p
, wore
für „reguläre Ausdrücke“ steht.quelle
g/re/p
kommt eigentlich voned
, nichtvi
. Grep ist ein paar Jahre älter als vi.nnoremap <leader>n :%s///gn<CR>
Zuordnung. Also drücke ich,<leader>n
um die Vorkommen des zuvor gesuchten Musters zu zählen. Ich benutze das überraschend oft.:%s/pattern//n
Dasn
Flag am Ende weist den:s
Befehl an, die Anzahl der Übereinstimmungen zu melden und nicht zu ersetzen. Lesen Sie:h :s_flags
für weitere Details.quelle
gn
?g
wenn Sie der Meinung sind, dass es mehr als eine Übereinstimmung pro Zeile gibt, was häufig zutrifft. Für die Fragestellung ist jedoch die Flaggen
wichtiger.Verwenden Sie zuerst
/
, um nach einem regulären Ausdruck zu suchenDies ist die gleiche Antwort wie bei Dhurva, mit der Ausnahme, dass es a.) Einfacher zu verwenden ist (da Sie eine Vorschau der Ergebnisse dessen anzeigen können, womit Ihre Regex zuerst übereinstimmt) und b.) Global mit dem
g
Flag übereinstimmt, um alle Vorkommen zu zählen .quelle
Dank dieser PR https://github.com/vim/vim/pull/4317 zeigt jeder Suchbefehl Suchstatistiken (wie die aktuelle Match-Position und die Anzahl der Matches) in Version 8.1.1270 an. Stellen Sie sicher, dass Sie
S
die Variable entfernenshortmess
.quelle
:%s/pattern//g
Sie sehen die Anzahl der Ersetzungen in der Statusleiste. So oft
pattern
erscheint das. Drücken Sie dann einfachu
, um die Ersetzungen rückgängig zu machen.quelle
Eine Zuordnung, die ich zu meiner .vimrc-Datei hinzugefügt habe, basierend auf den folgenden Antworten:
Ein bisschen Erklärung, hoffentlich hilfreich für neuere Vimmer:
<c-r><c-w>
fügt das Wort unter dem Cursor in die Befehlszeile ein, was in vielen Fällen nützlich ist.Das
<c-u>
wird benötigt, um das automatisch eingefügte zu entfernen,'<,'>
wenn Sie:
im visuellen Modus drücken und zur Befehlszeile gehen. Das*
Register enthält die (letzte) visuelle Auswahl,<c-r>*
fügt den Inhalt des*
Registers in die Befehlszeile ein (kann auch im Einfügemodus verwendet werden).quelle