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.

29voto

SMJ Punkte 688

Im vim, wenn Sie verwirrt sind, welche Zeilen betroffen sein werden, verwenden Sie unten

 :%s/foo/bar/gc  

Ändern Sie jedes 'foo' in 'bar', aber fragen Sie zuerst nach Bestätigung. Drücken Sie 'y' für Ja und 'n' für Nein. Vergessen Sie danach nicht zu speichern

:wq

22voto

Dinesh vishe Punkte 3021

VI Such- und Ersetzungsbefehlsbeispiele

Angenommen, Sie möchten ein Wort namens "foo" finden und mit "bar" ersetzen.

Drücken Sie zunächst die [Esc]-Taste

Geben Sie ein: (Doppelpunkt) gefolgt von %s/foo/bar/ und drücken Sie die [Enter]-Taste

:%s/foo/bar/

20voto

lingjiankong Punkte 197

Wir müssen uns nicht die aktuelle Zeilennummer eingeben.

Wenn Sie möchten, jeden foo in bar für die aktuelle Zeile (.) und die nächsten zwei Zeilen (+2) zu ändern, tun Sie einfach folgendes:

:.,+2s/foo/bar/g

Wenn Sie vor der Änderung bestätigen möchten, ersetzen Sie g durch gc:

:.,+2s/foo/bar/gc

6voto

ZhaoGang Punkte 3853

Um diese Frage zu beantworten:

:40,50s/foo/bar/g

ersetze foo durch bar in diesen Zeilen zwischen der 40. Zeile und der 50. Zeile (einschließlich), wenn du diesen Befehl ausführst, kannst du dich momentan in jeder Zeile befinden.

:50,40s/foo/bar/g

funktioniert auch, vim wird dich um Bestätigung bitten und dann die Ersetzung für dich durchführen, als hättest du den ersten Befehl eingegeben.

:,50s/foo/bar/g

ersetze foo durch bar in diesen Zeilen zwischen der Zeile, in der du dich momentan befindest, und der 50. Zeile (einschließlich). (wenn du in einer Zeile NACH der 50. Zeile bist, wird vim erneut um Bestätigung bitten)

Zur Klarstellung des Unterschieds zwischen vim und dem vrapper-plugin von Eclipse:

Beachte, dass in vrapper

:,50s/foo/bar/g Befehl NICHT funktionieren wird.

:50,40s/foo/bar/g wird ohne Bestätigung funktionieren.

(Für Vrapper Version 0.74.0 oder älter).

2voto

Die Festlegung des Bereichs durch visuelle Auswahl ist in Ordnung, aber wenn es sich um sehr einfache Operationen über nur ein paar Zeilen handelt, die von einem Operator ausgewählt werden können, wäre es am besten, diese Befehle als Operatoren anzuwenden.

Leider kann dies nicht mit den Standard-Vim-Befehlen gemacht werden. Sie könnten eine Art Workaround mit dem ! (Filter) Operator und einem beliebigen Textobjekt verwenden. Zum Beispiel, um die Operation auf einen Absatz anzuwenden, können Sie folgendes tun:

!ip

Dies muss als "Wenden Sie den Operator ! innerhalb eines Absatzes an" gelesen werden. Der Filteroperator startet den Befehlsmodus und fügt automatisch den Bereich von Zeilen ein, gefolgt von einem buchstäblichen "!", den Sie kurz danach löschen können. Wenn Sie dies auf den folgenden Absatz anwenden:

1
2 Repellendus qui velit vel ullam!
3 ipsam sint modi! velit ipsam sint
4 modi! Debitis dolorum distinctio
5 mollitia vel ullam! Repellendus qui
6 Debitis dolorum distinctio mollitia
7 vel ullam! ipsam
8
9 Mehr Text hier

Das Ergebnis nach Drücken von "!ap" wäre wie folgt:

:.,.+5

Da '.' (Punkt) die aktuelle Zeile bedeutet, wird der Bereich zwischen der aktuellen Zeile und den 5 Zeilen danach für die Operation verwendet. Jetzt können Sie den Ersatzbefehl genauso hinzufügen wie zuvor.

Der Nachteil ist, dass dies nicht einfacher ist als die Auswahl des Textes für die spätere Anwendung des Operators. Der Vorteil ist, dass dies das Einfügen des Bereichs für andere ähnliche Textbereiche (in diesem Fall Absätze) mit leicht unterschiedlicher Größe wiederholen kann. Wenn Sie später den Bereich für einen größeren Absatz auswählen möchten, wird '.' es richtig machen.

Außerdem, wenn Ihnen die Idee gefällt, semantische Textobjekte zur Auswahl des Operationsbereichs zu verwenden, können Sie mein Plugin EXtend.vim überprüfen, das dasselbe auf eine einfachere Weise tun kann.

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