Suchen Sie nach einem String und erhalten Sie die Anzahl im vi-Editor


105

Ich möchte mit dem vi-Editor nach einer Zeichenfolge suchen und die Anzahl der Vorkommen in einer Datei ermitteln.


11
Die ausgewählte Antwort ( :g/xxxx/d) ist schrecklich, gefährlich und anderen auf dieser Seite unterlegen. Bitte deaktivieren Sie es.
Bruno Bronosky

1
Ich stimme zu und es sagt Ihnen nur "Zeilen gelöscht", nicht "Vorkommen gelöscht"
user1709076

Antworten:


4
:g/xxxx/d

Dadurch werden alle Zeilen mit Muster gelöscht und es wird angegeben, wie viele gelöscht wurden. Rückgängig machen, um sie danach zurückzubekommen.


6
Natürlich kann er das "d" einfach weglassen, damit er nicht zur Operation muss.
Turm

15
Beachten Sie, dass hier nur angegeben wird, wie viele Zeilen und nicht wie viele Vorkommen vorhanden sind. Ich denke, Dolks ist eine bessere Lösung.

4
Meine unten stehende Lösung zählt mehrere Vorkommen innerhalb einer Zeile korrekt und es gibt nichts, was rückgängig gemacht werden könnte.
Mohit Chakraborty

6
Sehr gefährlich: o
Ankit Zalani

1
Dies soll nicht die akzeptierte / beliebteste Antwort sein. Was machen die SO-Moderatoren? :(
user1412066


121

Du brauchst die nFlagge. Um Wörter zu zählen, verwenden Sie:

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

und ein bestimmtes Wort:

:%s/the/&/gn        

Siehe count-itemsDokumentationsabschnitt.

Wenn Sie einfach Folgendes eingeben:

%s/pattern/pattern/g

In der Statuszeile wird dann auch die Anzahl der Übereinstimmungen in vi angezeigt.


Es sieht so aus, als ob diese Antwort für Vim-Benutzer und nicht für Vi ist :(
kadeshpa

Haben Sie nur vi auf Ihrem System? Welche Version?
Dirkgently

Jemand hat Ihre Frage mit vim markiert ... Ich habe sie entfernt.
Ojblass

38

:% s / string / string / g gibt die Antwort.


Was für eine bessere Antwort. +5 wenn möglich
ojblass

Ich denke, es würde nur funktionieren, wenn kein '. *' Im Muster verwendet wird
AK

10
Sie müssen die Zeichenfolge nicht wiederholen, tun Sie es einfach %s/string//ng.
Slm

23

(ähnlich wie Gustavo sagte, aber zusätzlich :)

Für jede vorherige Suche können Sie einfach Folgendes tun:

:%s///gn

Ein Muster wird nicht benötigt, da es sich bereits im Suchregister befindet (@/ ).

"%" - s/in der gesamten Datei
"g" ausführen - global suchen (mit mehreren Treffern in einer Zeile)
"n" - verhindert jegliches Ersetzen von s/- nichts wird gelöscht! nichts darf rückgängig gemacht werden!
(siehe: :help s_flagfür weitere Informationen)

(Auf diese Weise funktioniert es perfekt mit " Suche nach visuell ausgewähltem Text ", wie in vim-wikia tip171 beschrieben. )


3

verwenden

:% s / pattern / \ 0 / g

wenn die Musterzeichenfolge zu lang ist und Sie nicht alles noch einmal eingeben möchten.


1

Kurze Antwort :

:% s / zu durchsuchender String // gn

Zum Lernen :

Es gibt 3 Modi im VI-Editor wie unten Geben Sie hier die Bildbeschreibung ein

  • :Sie wechseln von Commandzum Command-lineModus. Was auch immer Sie danach schreiben, :befindet sich in der CLI (Command Line Interface).
  • %sGibt alle Zeilen an. Festlegen des Bereichs als% Mittel die gesamte Datei ersetzt. Die Syntax für alle Vorkommenssubstitutionen lautet:%s/old-text/new-text/g
  • gGibt alle Vorkommen in der Zeile an. Mit dem gFlag können Sie die gesamte Zeile ersetzen. Wenn dieses gFlag nicht verwendet wird, wird nur das erste Vorkommen in der Zeile ersetzt.
  • n Gibt an, wie viele Vorkommen ausgegeben werden sollen
  • //Doppelter Schrägstrich bedeutet Auslassen von replacement text. Weil wir nur finden wollen.

Sobald Sie die Anzahl der Vorkommen erhalten haben, können Sie drücken N Taste drücken, um die Vorkommen anzuzeigen.

Zum Finden und Zählen in einem bestimmten Bereich der Zeilennummern 1 bis 10:

: 1,10s / hallo // gn

  • Bitte beachten Sie, %dass die gesamte Datei durch ,getrennte Zeilennummern ersetzt wird.

Zum Finden und Ersetzen eines bestimmten Bereichs der Zeilennummern 1 bis 10:

: 1,10s / helo / hallo / gn


0

Ich schlage vor:

  1. Suchen Sie entweder mit *, um eine "begrenzte Suche" nach dem durchzuführen, was sich unter dem Cursor befindet, oder führen Sie einen Standard durch/pattern .
  2. Verwenden Sie :%s///gndiese Option , um die Anzahl der Vorkommen abzurufen. Oder Sie können verwenden :%s///n, um die Anzahl der Zeilen mit Vorkommen zu ermitteln.

** Ich konnte wirklich ein Plug-In finden, das die Meldung "Übereinstimmung N von N 1 mit N 2 " liefert bei jeder Suche die Meldung Zeilen" liefert, aber leider.

Hinweis: Lassen Sie sich nicht durch den schwierigen Wortlaut der Ausgabe verwirren. Der erstere Befehl könnte Ihnen so etwas wie 4 matches on 3 linesden letzteren geben 3 matches on 3 lines. Letzteres ist zwar technisch korrekt, aber irreführend und sollte "3 Zeilen stimmen überein" sagen. Wie Sie sehen, besteht also nie die Notwendigkeit, die letztere Form (nur 'n') zu verwenden. Sie erhalten die gleichen Informationen klarer und deutlicher, wenn Sie das 'gn'-Formular verwenden.

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.