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.

Kadeshpa
quelle
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.

Kevin Beck
quelle
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
180

Der Weg ist

:% s / pattern // gn

Gustavo
quelle
2
Dies ist die authentischste Antwort ohne Over-Kill-Trick.
user1412066
1
die beste Antwort!
Paulo Luvisoto
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.

dirkgently
quelle
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.

Mohit Chakraborty
quelle
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. )

tron5
quelle
3

verwenden

:% s / pattern / \ 0 / g

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

Sungwon Jeong
quelle
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

Om Sao
quelle
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.

Bruno Bronosky
quelle