Ersetzen Anführungszeichen um Strings in Vim?
Frage
Ich habe so etwas wie <Foobar Name='Hello There'/>
und müssen die einfachen Anführungszeichen um doppelte Anführungszeichen zu ändern. Ich habe versucht, :s/\'.*\'/\"\0\"
aber es endete <Foobar Name="'Hello There'"/>
produzieren. Ersetzen der \0
mit \1
nur eine leere Zeichenfolge innerhalb der doppelten Anführungszeichen produziert - gibt es eine spezielle Syntax fehlt mir, dass ich nur die gefundenen Zeichenfolge vornehmen müssen ( „Hallo There“) innerhalb der Anführungszeichen zu \1
zuweisen
Lösung
Sie müssen Verwendung Gruppierungen:
:s/\'\(.*\)\'/\"\1\"
So Argument 1 (dh \ 1) wird, entsprechen, was auch immer wird begrenzt durch \ (und \).
Andere Tipps
Es gibt auch surround.vim , wenn Sie schauen, um tun ziemlich oft diese. Sie würden cs'"
verwenden, um umschließenden Anführungszeichen zu ändern.
%s/'\([^']*\)'/"\1"/g
Sie wollen [^']*
statt .*
verwenden, sonst
'apples' are 'red'
würde "apples' are 'red"
, es sei denn ich etwas fehle, würde nicht s/\'/"/g
Arbeit?
Nur ein FYI - alle doppelten Anführungszeichen mit Einzel zu ersetzen, ist dies die richtige regexp - basierend auf rayd09 des Beispiel oben
:%s/"\([^"]*\)"/'\1'/g
Sie müssen um den Teil des Ausdrucks Sie erfassen möchten, runden Klammern setzen.
s/\'\(.*\)\'/"\1"/
Aber, könnten Sie Probleme mit ungewollten Übereinstimmungen haben. Können Sie möglicherweise keine einfachen Anführungszeichen mit doppelten Anführungszeichen in Ihrer Datei einfach ersetzen?
Sie haben die richtige Idee - Sie "\1"
als Ersatz-Klausel haben wollen, aber Sie müssen zuerst den 1 „Hallo dort“ Teil in Capture-Gruppe setzen (0 ist das gesamte Spiel). Versuchen Sie:
:%/'\(.*\)'/"\1"
Vorausgesetzt, Sie dies auf eine ganze Datei ...
tun wollenN-Modus:
ggvG$ [SHIFT+:]
X-Modus:
'<,'>/'/" [RET]