it-swarm.com.de

Suchen und ersetzen Sie Strings in vim in mehreren Zeilen

Ich kann :%s/<search_string>/<replace_string>/g zum Ersetzen einer Zeichenfolge in einer Datei oder :s/<search_string>/<replace_string>/ zum Ersetzen in der aktuellen Zeile verwenden.

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

Beispiel: Ersetzen Sie den Text aus den Zeilen 6-10, 14-18, jedoch nicht aus 11-13.

245
mu 無

Der Befehl :&& wiederholt die letzte Ersetzung mit denselben Flags. Sie können die zusätzlichen Bereiche dafür angeben (und beliebig viele verketten):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

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

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
193
Ingo Karkat

Alles ersetzen:

:%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

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

259

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

  • VISUAL mode (V)
  • VISUAL BLOCK mode (Ctrl+V)
  • VISUAL LINE mode (Shift+Vfunktioniert am besten in Ihrem Fall)

Nachdem Sie die zu ersetzenden Zeilen ausgewählt haben, geben Sie Ihren Befehl ein:

:s/<search_string>/<replace_string>/g

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

:'<,'>s/<search_string>/<replace_string>/g

Hier bedeutet '< einfach erste hervorgehobene Zeile und '> bedeutet letzte hervorgehobene Zeile .

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

:.s/<search_string>/<replace_string>/g

Beachten Sie außerdem, dass das Einfügen eines zweiten : zwischen dem Bereich und dem Befehl "Suchen/Ersetzen" keinen Schaden anrichtet. Mit anderen Worten, diese Befehle funktionieren weiterhin:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
45
Attila O.

Sie können dies mit zwei Suchen/Ersetzen-Sequenzen tun

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

Das zweite Mal, was Sie zum Anpassen brauchen, ist der Bereich. Statt alles einzugeben, würde ich den letzten Befehl aufrufen und nur den Bereich bearbeiten

27

Beispiele für VI-Suchen und Ersetzen von Befehlen

Nehmen wir an, Sie möchten ein Wort mit dem Namen „foo“ finden und durch „bar“ ersetzen.

Drücken Sie zuerst die [Esc]-Taste

Geben Sie Folgendes ein: (Doppelpunkt), gefolgt von %s/foo/bar/, und drücken Sie die [Eingabetaste]

:%s/foo/bar/

11
arnav

Wenn Sie verwirrt sind, welche Zeilen betroffen sind, verwenden Sie unten 

 :%s/foo/bar/gc  

Ändern Sie jedes 'foo' in 'bar', aber fragen Sie zuerst nach der Bestätigung. Vergiss nicht, danach zu speichern

:wq
8
SMJ

Wir müssen uns nicht die aktuelle Zeilennummer eingeben. 

Wenn Sie jede foo in bar für die aktuelle Zeile (.) und die beiden nächsten Zeilen (+2) ändern möchten, machen Sie einfach:

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

Wenn Sie die Änderungen bestätigen möchten, ersetzen Sie g durch gc

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

Das Angeben des Bereichs durch visuelle Auswahl ist in Ordnung, aber wenn es sehr einfache Operationen über nur ein paar Zeilen gibt, die von einem Operator __ ausgewählt werden können, ist es am besten, diese Befehle als Operatoren anzuwenden.

Dies kann leider nicht durch standardmäßige vim-Befehle ausgeführt werden. Sie können eine Art Abhilfe schaffen, indem Sie die! (Filter) Operator und ein beliebiges Textobjekt. Wenn Sie beispielsweise die Operation auf einen Absatz anwenden möchten, können Sie Folgendes tun:

!ip

Dies ist zu lesen als "Übernehmen Sie den Operator innerhalb eines Absatzes". Der Operator Startet den Befehlsmodus und fügt automatisch den Zeilenbereich Ein, gefolgt von einem Literal "!" dass Sie gleich nach .. löschen können .. Wenn Sie dies anwenden, auf den folgenden Absatz:

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  More text around here

Das Ergebnis nach dem Drücken von "! Ap" würde folgendermaßen aussehen:

:.,.+5

Als die '.' (Punkt) bezeichnet die aktuelle Linie, der Bereich zwischen der aktuellen Zeile und den 5 folgenden Zeilen wird für die Operation verwendet. Jetzt können Sie den Ersatzbefehl auf die gleiche Weise wie zuvor hinzufügen.

Das Schlimme ist, dass dies nicht einfacher ist als das Auswählen des Textes für letztere Anwendung des Operators. Das Gute daran ist, dass dies die Einfügung des Bereichs für andere ähnliche Textbereiche (in diesem Fall Absätze) mit geringfügig unterschiedlicher Größe wiederholen kann. Das heißt, wenn Sie später den Bereich größer auswählen möchten Absatz das '.' werde es richtig machen.

Wenn Ihnen die Idee der Verwendung von semantischen Textobjekten für die Auswahl des Operationsbereichs .__ gefällt, können Sie auch mein Plugin EXtend.vim überprüfen, das dasselbe Auf eine einfachere Weise tun kann .