erstellt 2001 · Komplexität grundlegend · Version 6.0
Vim stellt die :s
(Ersatz-) Befehl zum Suchen und Ersetzen; Dieser Tipp zeigt Beispiele für das Ersetzen. Auf einigen Systemen verfügt gvim im Menü Bearbeiten über Suchen und Ersetzen (: help: promptrepl). Die Verwendung des Befehls :s
ist jedoch aufgrund des Befehlszeilenverlaufs und der Fähigkeit zum Einfügen einfacher Text (z. B. das Wort unter dem Cursor) in die Such- oder Ersetzungsfelder.
Grundlegendes Suchen und Ersetzen
Der Befehl :substitute
sucht nach einem Textmuster und ersetzt es durch eine Textzeichenfolge. Es gibt viele Optionen, aber diese möchten Sie wahrscheinlich:
:s/foo/bar/g
Suchen Sie jedes Vorkommen von „foo“ (nur in der aktuellen Zeile) und ersetzen Sie es durch „bar“ „.:%s/foo/bar/g
Suchen Sie jedes Vorkommen von „foo“ (in allen Zeilen) und ersetzen Sie es durch „bar“.:%s/foo/bar/gc
Ändern Sie jedes „foo“ in „bar“, fordern Sie jedoch zuerst eine Bestätigung an.:%s/\<foo\>/bar/gc
Ändern Sie nur ganze Wörter, die genau mit „foo“ übereinstimmen, in „bar“. Fragen Sie nach Bestätigung.:%s/foo/bar/gci
Ändern Sie jedes „foo“ (Groß- und Kleinschreibung wird aufgrund desi
-Flag nicht berücksichtigt) in „bar“. Fragen Sie nach Bestätigung.:%s/foo\c/bar/gc
ist dasselbe, da\c
die Groß- und Kleinschreibung nicht berücksichtigt. Dies kann erwünscht sein, nachdem Sie:set noignorecase
verwendet haben, um die Suche zwischen Groß- und Kleinschreibung zu unterscheiden (Standardeinstellung).:%s/foo/bar/gcI
Ändern Sie jedes „foo“ (Groß- und Kleinschreibung aufgrund desI
-Flag) in „bar“. Fragen Sie nach Bestätigung.:%s/foo\C/bar/gc
ist dasselbe, da\C
die Suche zwischen Groß- und Kleinschreibung unterscheidet. Dies kann erwünscht sein, nachdem:set ignorecase
verwendet wurde, um bei Suchanfragen die Groß- und Kleinschreibung nicht zu berücksichtigen.
Das Flag g
bedeutet global – jedes Vorkommen in der Zeile wird geändert und nicht nur das erste. In diesem Tipp wird die Standardeinstellung für die Optionen "gdefault"
und "edcompatible"
(aus) vorausgesetzt, für die die Option g
-Flag muss in %s///g
enthalten sein, um einen globalen Ersatz durchzuführen. Die Verwendung von :set gdefault
führt zu Verwirrung, da %s///
global ist, während %s///g
dies nicht ist (d. H. , g
kehrt seine Bedeutung um).
Wenn Sie das Flag c
verwenden, müssen Sie für jede Übereinstimmung bestätigen, was machen. Vim gibt Folgendes aus: replace with foobar (y/n/a/q/l/^E/^Y)?
(wobei foobar der Ersatzteil des Befehls :s/.../.../
ist. Sie können bedeutet, diese Übereinstimmung zu ersetzen, n
, um diese Übereinstimmung zu überspringen, a
, um diese und alle verbleibenden Übereinstimmungen zu ersetzen ( „alle“ verbleibenden Übereinstimmungen), q
, um den Befehl zu beenden, l
, um diese Übereinstimmung zu ersetzen und zu beenden (denken Sie an „last“), ^E
, um den Bildschirm nach oben zu scrollen, indem Sie die Strg-Taste gedrückt halten und E drücken, und ^Y
, um den Bildschirm nach unten zu scrollen, indem Sie die Strg-Taste gedrückt halten und drücken Y. Die letzten beiden Optionen sind jedoch nur verfügbar, wenn Ihr Vim normal, groß oder riesig gebaut ist oder die Funktion insert_expand zum Zeitpunkt der Kompilierung aktiviert wurde (suchen Sie in der Ausgabe nach +insert_expand
von :version
).
Auch bei Verwendung des Flags c
springt Vim zu t Die erste Übereinstimmung, die gefunden wird, beginnt oben im Puffer und fordert Sie zur Bestätigung auf, eine Ersetzung für diese Übereinstimmung durchzuführen. Vim wendet die Markierungsgruppe IncSearch
auf den übereinstimmenden Text an, um Ihnen einen visuellen Hinweis darauf zu geben, mit welcher Übereinstimmung er arbeitet (auf reverse
gesetzt) Standardmäßig für alle drei Begriffstypen ab Vim 7.3). Wenn mehr als eine Übereinstimmung gefunden wird und die Suchhervorhebung mit :set hlsearch
aktiviert ist, hebt Vim die verbleibenden Übereinstimmungen mit der Search
-Highlight-Gruppe hervor . Wenn Sie die Suchhervorhebung verwenden, sollten Sie sicherstellen, dass diese beiden Hervorhebungsgruppen visuell unterschiedlich sind, oder Sie können nicht leicht erkennen, welche Übereinstimmung Vim Sie zum Ersetzen auffordert.
Details
Suchbereich:
Hinweis: Ab Vim 7.3 werden Ersetzungen auf einen Bereich angewendet, der durch Markierungen oder eine visuelle Auswahl definiert ist (wobei ein spezieller Markentyp „< verwendet wird und „>) sind standardmäßig nicht an die Spaltenposition der Marken gebunden. Stattdessen wendet Vim die Ersetzung auf die gesamte Zeile an, in der jede Marke erscheint, es sei denn, die\%V
Atom wird in dem Muster wie folgt verwendet::"<,">s/\%Vfoo/bar/g
.
Bei der Suche:
.
,*
,\
,gibt eine / Sammlung an. Zeichenbereiche können mit einem
-
dargestellt werden. Beispielsweise kann ein Buchstabe a, b, c oder die Nummer 1 mitabgeglichen werden. Negieren Sie die Sammlung mit
, das mit einem beliebigen Zeichen außer a, b, c oder 1 übereinstimmt.
\{#\}
wird zur Wiederholung verwendet./foo.\{2\}
stimmt mit foo und den beiden folgenden Zeichen überein. Die\
ist beim Schließen}
nicht erforderlich, sodass/foo.\{2}
dasselbe tut.\(foo\)
verweist auf foo. Klammern ohne Escapezeichen sind buchstäblich aufeinander abgestimmt. Hier wird die\
zum Schließen von\)
benötigt.
Beim Ersetzen von:
\r
ist Zeilenumbruch,\n
ist ein Nullbyte (0x00).\&
ist kaufmännisches Und (& ist der Text, der dem Suchmuster entspricht).\0
fügt den Text ein, der mit dem gesamten Muster übereinstimmt.\1
fügt den Text der ersten Rückreferenz ein.\2
fügt die zweite Rückreferenz ein und so weiter.
Sie können andere Begrenzer mit Ersatz verwenden:
:s#http://www.example.com/index.html#http://example.com/#
Speichern Sie die Eingabe mit \zs
und \ze
, um den Anfang und das Ende eines Musters festzulegen. Beispiel: Anstelle von:
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Verwenden Sie:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Verwenden Sie das aktuelle Wort oder Register
:%s//bar/g
Ersetzen Sie jede Übereinstimmung des letzten Suchmusters durch „bar“. Sie können beispielsweise zuerst den Cursor auf das Wortfoo
setzen und dann*
drücken, um nach diesem Wort zu suchen. Der obige Ersatz würde dann alle Wörter, die genau mit „foo“ übereinstimmen, in „bar“ ändern.:%s/foo/<c-r><c-w>/g
Ersetzen Sie jedes Vorkommen von „foo“ durch das Wort unter dem Cursor.<c-r><c-w>
bedeutet, dass Sie Strg-R und dann Strg-W drücken. Das Wort unter dem Cursor wird so eingefügt, als hätten Sie es eingegeben.:%s/foo/<c-r><c-a>/g
Ersetzen Sie jedes Vorkommen von „foo“ durch das WORT unter dem Cursor (durch Leerzeichen begrenzt).<c-r><c-a>
bedeutet, dass Sie Strg-R und dann Strg-A drücken. Das WORT unter dem Cursor wird so eingefügt, als hätten Sie es eingegeben.:%s/foo/<c-r>a/g
Ersetzen Sie jedes Vorkommen von „foo“ durch den Inhalt des Registers „a“.<c-r>a
bedeutet, dass Sie Strg-R drücken und danna
. Der Inhalt des Registers „a“ wird so eingefügt, als hätten Sie es eingegeben.:%s/foo/<c-r>0/g
Wie oben, mit Register 0, das den Text des letzten Yank-Befehls enthält. Beispiele für yank (copy) -Befehle sindyi(
, das den Text in Klammern um den Cursor kopiert, undy$
, das den Text vom Cursor kopiert bis zum Ende der Zeile. Nach einem Yank-Befehl, der kein Zielregister angegeben hat, kann der kopierte Text durch Drücken von Strg-R und dann0
eingegeben werden.:%s/foo/\=@a/g
Ersetzen Sie jedes Vorkommen von „foo“ durch den Inhalt des Registers „a“.\=@a
ist eine Referenz zum Register „a“. Der Inhalt des Registers „a“ wird im Befehl nicht angezeigt. Dies ist nützlich, wenn das Register viele Textzeilen enthält.:%s//<c-r>//g
Ersetzen Sie jede Übereinstimmung des letzten Suchmusters durch das Register/
(das letzte Suchmuster). Nachdem Sie Strg-R und dann/
gedrückt haben, um das letzte Suchmuster einzufügen (und bevor Sie die Eingabetaste drücken, um den Befehl auszuführen), können Sie den Text bearbeiten, um die erforderlichen Änderungen vorzunehmen.:%s/<c-r>*/bar/g
Ersetzen Sie alle Vorkommen des Textes in der Systemzwischenablage (im Register*
) durch „bar“ (siehe nächstes Beispiel, wenn mehrzeilig) . Auf einigen Systemen ist nur die Auswahl von Text (in Vim oder einer anderen Anwendung) erforderlich, um diesen Text in das Register*
zu stellen.:%s/<c-r>a/bar/g
Ersetzen Sie alle Vorkommen des Textes im Register „a“ durch „bar“.<c-r>a
bedeutet, dass Sie Strg-R drücken und danna
. Der Inhalt des Registers „a“ wird so eingefügt, als hätten Sie es eingegeben. Alle Zeilenumbrüche im Register „a“ werden als^M
eingefügt und nicht gefunden. Die Suche funktioniert, wenn jedes^M
manuell durch „\ n“ ersetzt wird (zwei Zeichen: Backslash, „n“). Diese Ersetzung kann durchgeführt werden, während Sie den folgenden Befehl eingeben::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g
Die"\n"
(doppelte Anführungszeichen) steht für die Zeilenumbruchzeichen; Die"\\n"
(einfache Anführungszeichen) steht für zwei Backslashes, gefolgt von „n
„.Die Funktionsubstitute()
wird vom Ausdrucksregister<c-r>=
(Strg-R=
) ausgewertet. Es ersetzt jede neue Zeile durch einen einzelnen Backslash, gefolgt von „n
„. Die<CR>
zeigt an, dass Sie die Eingabetaste drücken, um den Ausdruck=
zu beenden.:%s/<c-r>0/bar/g
Wie oben, mit Register 0, das den Text des letzten Yank-Befehls enthält.
Siehe Einfügen von Registern in Such- oder Doppelpunktbefehlen anstelle der Zwischenablage.
Zusätzliche Beispiele
:%s/foo/bar/
Ersetzen Sie in jeder Zeile das erste Vorkommen von „foo“ mit „bar“.:%s/.*\zsfoo/bar/
Ersetzen Sie in jeder Zeile das letzte Vorkommen von „foo“ durch „bar“.:%s/\<foo\>//g
Löschen Sie in jeder Zeile alle Vorkommen des gesamten Wortes „foo“.:%s/\<foo\>.*//
Löschen Sie in jeder Zeile das gesamte Wort „foo“ und den gesamten folgenden Text (bis zum Zeilenende).:%s/\<foo\>.\{5}//
Löschen Sie in jeder Zeile das erste Vorkommen des gesamten Wortes „foo“ und der folgenden fünf Zeichen.:%s/\<foo\>\zs.*//
Löschen Sie in jeder Zeile den gesamten Text nach dem gesamten Wort „foo“ (bis zum Zeilenende).:%s/.*\<foo\>//
Löschen Sie in jeder Zeile das gesamte Wort „foo“ und den gesamten vorhergehenden Text (vom Zeilenanfang).:%s/.*\ze\<foo\>//
Löschen Sie in jeder Zeile den gesamten Text vor dem gesamten Wort „foo“ (vom Zeilenanfang).:%s/.*\(\<foo\>\).*/\1/
Löschen Sie in jeder Zeile den gesamten Text vor und nach dem gesamten Wort „foo“.:%s/\<foo\(bar\)\@!/toto/g
Ersetzen Sie in jeder Zeile jedes Vorkommen von „foo“ (das ein Wort beginnt und nicht von „bar“ gefolgt wird) durch „toto“.:s/^\(\w\)/\u\1/
Wenn das erste Zeichen am Anfang der aktuellen Zeile nur in Kleinbuchstaben geschrieben ist, schalten Sie es mit\u
in Großbuchstaben um (siehe Umschalten der Groß- und Kleinschreibung von Zeichen) ).:%s/\(.*\n\)\{5\}/&\r/
Fügen Sie alle 5 Zeilen eine Leerzeile ein. Das Muster sucht nach
\(.*\n\)
(jede Zeile einschließlich ihres Zeilenende), das fünfmal wiederholt wird (\{5\}
). Die Ersetzung lautet&
(der gefundene Text), gefolgt von\r
(Zeilenumbruch).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g
Ruft eine Liste der Suchergebnisse ab. (Die Liste muss vorhanden sein.) Setzt das Flagmodified
aufgrund der Ersetzung, der Inhalt bleibt jedoch unverändert. Hinweis: Mit einem ausreichend aktuellen Vim (Version 7.3.627 oder höher) können Sie dies vereinfachen, um::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn
Dies hat den Vorteil, dass der Puffer nicht als geändert markiert wird und nein Es wird ein zusätzlicher Rückgängig-Status erstellt. Der Ausdruck im Ersatzteil wird in der Sandbox ausgeführt und darf den Puffer nicht ändern.
Sonderfälle
Zum Ersetzen von Mustern durch entsprechenden Text, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, Michael Geddes “ Das Keepcase-Plugin kann verwendet werden, z. B.:
:%SubstituteCase/\cHello/goodBye/g
Ersetzen Sie „Hallo, hallo, hallo Hallo“ durch „Auf Wiedersehen, auf Wiedersehen, goodBye GOODBYE“ (Zeilennummer eines Blocks) kann dieses kleine Snippet verwendet werden:s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g
Nützlich, wenn wir einige Blöcke aus einem Patch entfernen möchten, ohne dass ein Patch erforderlich ist Beschweren Sie sich über Versatzunterschiede.
Hinweis Sollte versuchen, den Ausdruck kompakter zu gestalten, aber Sie wissen nicht wie, ohne die Möglichkeit zu haben, unerwünschte Zeilen zu ändern.
Siehe auch: Verwenden von Ersatz
- 63 Anwenden von Ersetzungen auf einen visuellen Block
- 81 Ersetzen von Zeichen und Zeilen auf einfache Weise
- 159 Speichern von Tastenanschlägen Ersetzen und Suchen
- 406 Alternative Trennzeichen für das Ersetzen Befehl
- 438 Suchen und Ersetzen in einer visuellen Auswahl
- 464 Suchen und Ersetzen des Wortes unter dem Cursor
- 479 Ersetzen ohne Eingabe
- 573 Wiederholen eines Ersatzes von der aktuellen Cursorposition
- 605 Ersetzen Sie ein Wort durch den gezogenen Text
- 654 Sonderzeichen im Ersatzbefehl
- 755 Verwenden eines Ausdrucks in Ersatzbefehl
- 808 Ersetzen Sie einen visuellen Textblock durch einen anderen solchen Block.
- 915 Verwenden von g anstelle von Ersatz
- 971 Ersetzen Sie durch inkrementierende Zahlen
- 1114 Schritt inkrementieren und ersetzen
- 1501 Letzte Suche ersetzen
Siehe auch: In Puffern / Dateien ersetzen
- 382 Suche und in mehreren Puffern ersetzen
- : Hilfe: Ersetzen
- : Hilfe cmdline-r anges
- : Hilfemuster
- : Hilfe „gdefault“
- : Hilferegister
TO DO
The Ein großer Abschnitt „Siehe auch“ kann für Leser nützlich sein. Wir müssen einige der zugehörigen Tipps zusammenführen (aber das Ergebnis nicht zu komplex machen). Ich habe die Tippnummern eingefügt, damit die Redakteure den Überblick behalten.
In einem kurzen Abschnitt wird erwähnt, dass einfache Substitute häufig am besten sind Dies erfolgt durch Suchen und manuelles Ändern (und Drücken von .
, um die letzte Änderung zu wiederholen). Außerdem können Sie entscheiden, wie jede Instanz geändert werden soll.Unter Kopieren oder Ändern des Suchtreffers finden Sie eine Technik, bei der Sie n
drücken können, um die nächste Instanz zu finden. Geben Sie dann cs
ein, um den Suchtreffer zu ändern zu was auch immer.
Hat sich in letzter Zeit etwas geändert, wie% s funktioniert? Irgendwie kann ich sowohl < cr > als auch \ = @ als Ersatz verwenden, aber ich kann sie nicht als Suche und Ersatz verwenden.
Wenn Sie genau beschreiben, was Sie tun und was passiert, kann ich Ihnen möglicherweise helfen, obwohl ich Fragen stelle. JohnBeckett (Diskussion) 02:15, 1. Juni 2019 (UTC)