Suchen und Ersetzen

Tipp 31 Druckbares Monobuch Zurück Weiter

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/gSuchen Sie jedes Vorkommen von „foo“ (nur in der aktuellen Zeile) und ersetzen Sie es durch „bar“ „.:%s/foo/bar/gSuchen 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/gcist dasselbe, da\cdie Groß- und Kleinschreibung nicht berücksichtigt. Dies kann erwünscht sein, nachdem Sie:set noignorecaseverwendet 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/gcist dasselbe, da\Cdie Suche zwischen Groß- und Kleinschreibung unterscheidet. Dies kann erwünscht sein, nachdem:set ignorecaseverwendet 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\%VAtom 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:

\rist Zeilenumbruch,\nist ein Nullbyte (0x00).\&ist kaufmännisches Und (& ist der Text, der dem Suchmuster entspricht).\0fügt den Text ein, der mit dem gesamten Muster übereinstimmt.\1fügt den Text der ersten Rückreferenz ein.\2fü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/gErsetzen Sie jede Übereinstimmung des letzten Suchmusters durch „bar“. Sie können beispielsweise zuerst den Cursor auf das Wortfoosetzen 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>/gErsetzen 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>/gErsetzen 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/gErsetzen Sie jedes Vorkommen von „foo“ durch den Inhalt des Registers „a“.<c-r>abedeutet, 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/gWie 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 dann0eingegeben werden.:%s/foo/\=@a/gErsetzen Sie jedes Vorkommen von „foo“ durch den Inhalt des Registers „a“.\=@aist 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>//gErsetzen 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/gErsetzen 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>abedeutet, 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^Meingefügt und nicht gefunden. Die Suche funktioniert, wenn jedes^Mmanuell 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/gDie"\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/gWie 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\>//gLö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/gErsetzen 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\uin 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)/gRuft eine Liste der Suchergebnisse ab. (Die Liste muss vorhanden sein.) Setzt das Flagmodifiedaufgrund 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))/gnDies 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/gErsetzen 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)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.