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.


Antworten:


93

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.


2
+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.


4
Ist es nicht gn?
Du

1
@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 .


3

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.


2

:%s/pattern//g

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.


1

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.