2009-04-03 8 views
87

Ich möchte nach einer Zeichenkette suchen und die Anzahl der Vorkommen in einer Datei mit dem Editor vi finden.Suche nach Zeichenketten und Zählung in vi Editor

+2

Die ausgewählte Antwort (': g/xxxx/d') ist schrecklich, gefährlich und anderen auf dieser Seite unterlegen. Bitte deaktiviere es. –

+0

ich stimme zu und es sagt Ihnen nur 'Zeilen gelöscht' nicht 'Vorkommen gelöscht' – user1709076

Antwort

15
:g/xxxx/d 

Dies wird alle Linien mit Muster löschen und berichten, wie viele gelöscht. Rückgängig machen, um sie zurückzubekommen.

+4

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

+13

Beachten Sie, dass dies nur angibt, wie viele Zeilen - nicht wie viele Vorkommen. Ich glaube, dirks ist eine bessere Lösung. –

+4

Meine Lösung zählt korrekt mehrere Vorkommen innerhalb eine Zeile und es gibt nichts zu rückgängig machen. –

37

:% s/string/string/g wird die Antwort geben.

+0

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

+0

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

+9

Keine Notwendigkeit, die Zeichenfolge zu wiederholen, tun Sie einfach '% s/string // ng'. – slm

119

Sie benötigen die n Flagge. Zu zählen Wörter verwenden:

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

und ein bestimmtes Wort:

:%s/the/&/gn   

Siehe count-items Dokumentation Abschnitt.

Wenn Sie einfach in ein:

%s/pattern/pattern/g 

dann in der Statuszeile erhalten Sie die Anzahl der Spiele in vi auch geben.

+0

Es sieht so aus als ob diese Antwort für Vim Benutzer und nicht für Vi lautet :( – kadeshpa

+0

Hast du nur vi auf deinem System? Welche Version? – dirkgently

+0

Jemand hat deine Frage mit vim darin markiert ... Ich habe es entfernt. – ojblass

137

Der Weg ist

:% s/Muster // gn

+6

+1 für l ess tippen und auf den Punkt. – Leafy

+0

Dies ist die authentischste Antwort ohne Übersteuerungstrick. – user1412066

2

Verwendung

:% s/Muster/\ 0/g

wenn Musterstring ist zu lang und du möchtest es nicht noch einmal tippen.

17

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

Für zuvor Suche, können Sie einfach:

:%s///gn 

Ein Muster ist nicht erforderlich, da es bereits bei der Suche ist -Register (@/).

"%" - do s/ in der gesamten Datei
"g" - Die globale Suche (mit mehreren Treffern in einer Zeile)
"n" - verhindert, dass Ersatz von s/ - nichts gelöscht! nichts muss rückgängig gemacht werden!
(siehe: :help s_flag für weitere Informationen)

(Auf diese Weise ist es perfekt mit "Suche nach visuell markierten Text" funktioniert, wie in vim-wikia tip171 beschrieben)

0

Ich schlage vor, zu tun:

  1. Suchen Sie entweder mit * nach einer "begrenzten Suche" nach dem, was sich unter dem Cursor befindet, oder führen Sie eine Standard /pattern Suche aus.
  2. Verwenden Sie :%s///gn, um die Anzahl der Vorkommen zu erhalten.Oder Sie können :%s///n verwenden, um die Anzahl der Zeilen mit Vorkommen zu erhalten.

** mir wirklich mit mir eine Plug-in, das Messaging geben würde finden konnte "Match N von N auf N Zeilen" mit jeder Suche, aber leider.

Hinweis: Nicht durch die knifflige Formulierung der Ausgabe verwirrt werden. Der vorherige Befehl könnte Ihnen etwas wie 4 matches on 3 lines geben, wo letzteres Ihnen 3 matches on 3 lines geben könnte. Während technisch genau ist, ist letzteres irreführend und sollte "3 Zeilen übereinstimmen" sagen. Wie Sie sehen können, gibt es wirklich nie die Notwendigkeit, die letztgenannte Form zu verwenden. Sie erhalten die gleichen Informationen, klarer und mehr mit dem 'gn' Formular.