591 Stimmen

Finden und Ersetzen von Zeichenfolgen in Vim auf mehreren Zeilen

Ich kann :%s///g verwenden, um einen String in einer Datei zu ersetzen, oder :s/// um es in der aktuellen Zeile zu ersetzen.

Wie kann ich Wörter aus bestimmten Zeilen in vim auswählen und ersetzen?

Beispiel: Text von Zeilen 6-10, 14-18 ersetzen, aber nicht von 11-13.

758voto

Ersetze alle:

:%s/foo/bar/g

Finde jedes Vorkommen von 'foo' (in allen Zeilen) und ersetze es durch 'bar'.

Für bestimmte Zeilen:

:6,10s/foo/bar/g

Ändere jedes 'foo' in 'bar' für alle Zeilen von Zeile 6 bis Zeile 10 einschließlich.

325voto

Ingo Karkat Punkte 159961

Der Befehl :&& wiederholt die letzte Ersetzung mit denselben Flags. Sie können ihm zusätzliche Bereiche geben (und so viele wie Sie möchten miteinander verketten):

:6,10s///g | 14,18&&

Wenn Sie jedoch viele Bereiche haben, würde ich eher eine Schleife verwenden:

:for range in split('6,10 14,18')| exe range 's///g' | endfor

79voto

Attila O. Punkte 14514

Als kleiner Hinweis, anstatt die Zeilennummern eingeben zu müssen, können Sie einfach die Zeilen markieren, in denen Sie suchen/ersetzen möchten, in einem der visuellen Modi:

  • VISUAL-Modus (V)
  • VISUAL BLOCK-Modus (Strg+V)
  • VISUAL LINE-Modus (Umschalt+V, funktioniert am besten in Ihrem Fall)

Nachdem Sie die Zeilen zum Ersetzen ausgewählt haben, geben Sie Ihren Befehl ein:

:s///g

Sie werden feststellen, dass der Bereich '<,'> automatisch für Sie eingefügt wird:

:'<,'>s///g

Hier bedeutet '< einfach die erste markierte Zeile und '> bedeutet die letzte markierte Zeile.

Beachten Sie, dass das Verhalten im NORMAL-Modus möglicherweise unerwartet ist: '< und '> zeigen auf den Anfang und das Ende der zuletzt hervorgehobenen Zeile in einem der VISUAL-Modi. Stattdessen kann im NORMAL-Modus die spezielle Zeilennummer . verwendet werden, was einfach aktuelle Zeile bedeutet. Daher können Sie nur auf der aktuellen Zeile suchen/ersetzen, wie folgt:

:.s///g

Eine weitere Sache zu beachten ist, dass das Einfügen eines zweiten : zwischen dem Bereich und dem Suchen/Ersetzen-Befehl keinen Schaden anrichtet, mit anderen Worten, diese Befehle funktionieren immer noch:

:'<,'>:s///g
:.:s///g

61voto

Rahul Ravi Punkte 809

Suchen und Ersetzen

:%s/search\|search2\|search3/replace/gci

g => globale Suche

c => Zuerst um Bestätigung bitten

i => Groß-/Kleinschreibung ignorieren

Wenn Sie eine direkte Ersetzung ohne Bestätigung wünschen, verwenden Sie den folgenden Befehl

:%s/search/replace/g

Wenn Sie für jede Ersetzung eine Bestätigung wünschen, führen Sie den folgenden Befehl aus

:%s/search/replace/gc

Zuerst um Bestätigung bitten, hier wird die Schreibweise ignoriert.

:%s/search/replace/gci

35voto

Lieven Keersmaekers Punkte 55277

Sie können es mit zwei Suchen/Ersetzen-Folgen machen

  :6,10s///g
  :14,18s///g

Das zweite Mal müssen Sie nur den Bereich anpassen, anstatt ihn komplett neu einzugeben. Ich würde den letzten Befehl aufrufen und nur den Bereich bearbeiten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X