Wie suchen Sie in Vim nach einem Text?
Drücken Sie die Taste / , geben Sie Ihren Suchtext ein und drücken Sie die Eingabetaste. Dies ist genau wie der Less-Befehl.
Aber diese Methode der Textsuche erlaubt Ihnen nicht, das gefundene Ergebnis zu ersetzen.
Lassen Sie mich Ihnen mitteilen, wie Sie in Vim suchen und ersetzen können .
:%s/foo/bar/gci
Der obige Befehl führt eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durch, um alle Vorkommen Ihres Suchbegriffs (foo) mit dem neuen Begriff (bar) zu finden. Mit dem Flag c fordert es zur Bestätigung auf, bevor eine Ersetzung ersetzt wird.
Lassen Sie mich ins Detail gehen und die Dinge klarer erklären.
Verwendung des Substitute-Befehls zum Suchen und Ersetzen von Text in Vim
Ich denke, Sie wissen bereits, dass Sie sich im normalen Modus (auch bekannt als Befehlsmodus) befinden müssen, um einen Befehl in Vim auszuführen. Drücken Sie die Esc-Taste, um in diesen Modus zu gelangen.
Vim hat einen praktischen Befehl :substitue
, kann auch mit der kürzeren Version :s
verwendet werden .
Unten ist die allgemeine Syntax des Ersatzbefehls:
:[range]s/{pattern}/{string}/[flags] [count]
Lassen Sie uns diese Syntax aufschlüsseln. Alles zwischen den eckigen Klammern '[]' ist optional.
range
:Dieser Teil der Syntax kann verwendet werden, wenn Sie die Ersetzung zwischen den Zeilen wünschen. Wenn Sie keinen Bereich angeben, wird nur der Text in der aktuellen Zeile ersetzt . (Ich habe eine Tabelle für die Reichweite geteilt)pattern
:Hier geben Sie den Text an, den Sie ersetzen möchten.string
:Dies ist die Zeichenfolge, die das Muster ersetzen wird.flags
:Um alle Vorkommen des Suchmusters zu ersetzen, verwenden Sie deng
Flagge. Sie können angeben, ob Groß- und Kleinschreibung bei der Übereinstimmung ignoriert werden sollen, indem Siei
verwenden Flagge. Um jeden Such- und Ersetzungsvorgang manuell zu bestätigen, verwenden Sie denc
Flagge.count
:Anzahl der Zeilen, in denen Text ersetzt werden soll.
Bereich | Beschreibung |
---|---|
. | Aktuelle Zeile |
$ | Letzte Zeile |
% | Alle Zeilen |
x | Zeilennummer x |
.,+x | Von der aktuellen Zeile bis zu weiteren x Zeilen |
Beispiele zum Suchen und Ersetzen in Vim
Lassen Sie uns ein paar Beispiele durchgehen, die die Verwendung des Ersatzbefehls in Vim demonstrieren.
Unten ist der Screenshot der Datei, die ich verwenden werde, um die Verwendung des Ersatzbefehls in Vim zu demonstrieren.
Einfache Textersetzung
Für dieses Beispiel habe ich darauf geachtet, dass der String 'Hallo' mehrmals in mindestens einer Zeile und mehrfach in der Datei vorkommt.
Ich möchte „Hallo“ durch die Zeichenfolge „HI“ ersetzen. Unten ist der Vim-Befehl, um das zu tun:
:%s/Hello/HI/g
Durch Bestätigung ersetzen
Um Text zu ersetzen, aber jedes Mal eine Bestätigung wünschen, können Sie den c
verwenden im Ersatzbefehl.
:%s/Hello/HI/gc
Wie Sie dem Video entnehmen können, fragt mich Vim jedes Mal nach einer Bestätigung, bevor ein Muster ersetzt wird.
Sie haben auch eine Eingabeaufforderung, die wie die folgende Zeile aussieht:
replace with HI (y/n/a/q/l/^E/^Y)?
Die Optionen der Eingabeaufforderung haben folgende Bedeutung:
- y:ja
- n:nein
- a:alle
- q:Beenden ohne Ersetzen, aber es wird nicht rückgängig gemacht, wenn Sie bereits Text ersetzt haben
- l:ersetzen Sie dies und beenden Sie (denken Sie an 'last')
- ^E:Nach oben scrollen (funktioniert nicht in
vim-tiny
) - ^Y:Nach unten scrollen (funktioniert nicht in
vim-tiny
)
Ersetzung ohne Berücksichtigung der Groß-/Kleinschreibung
Wenn Sie Text ersetzen möchten, unabhängig davon, ob es sich um Groß- oder Kleinbuchstaben handelt, sollten Sie in diesem Fall (haha) das i
verwenden Flag im Ersatzbefehl.
:%s/hello/HI/gi
Wie Sie bemerken, werden alle Vorkommen von „hello“ oder „Hello“ und sogar „hELLO“ durch „HI“ ersetzt. Dies ist eine Musterersetzung, bei der die Groß-/Kleinschreibung nicht berücksichtigt wird.
Jedes „Hallo“ wird durch „HI“ ersetzt, obwohl die meisten „Hallo“ ein großes „H“ enthalten.
Text in einer Zeile in Vim ersetzen
Um Text in einer einzelnen Zeile zu ersetzen, müssen wir den Bereich angeben, der den Umfang der Ersetzung auf die aktuelle Zeile begrenzt.
Verwenden Sie dafür besser den .
Bereichsdeskriptor.
:.s/Hello/HI/g
Wie Sie sehen können, wurde nur das Muster in der ersten Zeile ersetzt, weil ich den Punkt '.' Bereichsdeskriptor.
Bonus-Tipp:Verwendung eines anderen Trennzeichens
Beim Betrachten der Syntax des Ersatzbefehls habe ich erwähnt, dass das Muster und die Zeichenfolge durch einen Schrägstrich '/' getrennt sind.
Aber was wäre, wenn Sie Text mit vielen Schrägstrichen im Muster/Zeichenfolge hätten, wie z. B. einen Pfad, der sich überall in der Datei wiederholt? Schrägstriche zu maskieren kann mühsam sein und manchmal leicht übersehen werden.
Anstatt den Schrägstrich als Trennzeichen zu verwenden, können Sie stattdessen ein anderes Trennzeichen verwenden.
Ein paar Trennzeichen, die ich gesehen habe, sind #
, _
und @
.
Hier ist ein gif, das die Verwendung von @
demonstriert als Trennzeichen anstelle von /
.
Schlussfolgerung
Das Ersetzen von Text kann häufig vorkommen, und Vim bietet Ihnen eine leistungsstarke Methode zum Suchen und Ersetzen von Mustern durch eine Zeichenfolge. Sie können sogar Regex in Vims Substitutionsbefehl mischen.
Wenn Sie daran interessiert sind, mehr als nur die Vim-Grundlagen zu lernen, empfehle ich dringend, dieses Programm von Jovica Ilic zu verwenden.