Ich habe etwas wie <Foobar Name='Hello There'/>
und müssen die einfachen Anführungszeichen in doppelte Anführungszeichen ändern. Ich versuchte :s/\'.*\'/\"\0\"
, aber es endete, <Foobar Name="'Hello There'"/>
zu produzieren. Ersetzen der \0
durch \1
erzeugt nur eine leere Zeichenfolge innerhalb der Anführungszeichen - gibt es einige spezielle Syntax Ich vermisse, dass ich nur die gefundene Zeichenfolge ("Hello There") innerhalb der Anführungszeichen zu \1
zuweisen müssen?Anführungszeichen um Strings in Vim ersetzen?
Antwort
Sie müssen Gruppierungen verwenden:
:s/\'\(.*\)\'/\"\1\"
Auf diese Weise Argument 1 (dh \ 1) entsprechen wird, was durch \ begrenzt wird (und \).
Sie müssen runde Klammern um den Teil des Ausdrucks legen, den Sie erfassen möchten.
s/\'\(.*\)\'/"\1"/
Aber Sie könnten Probleme mit unbeabsichtigter Übereinstimmung haben. Könnten Sie einfache Anführungszeichen einfach durch doppelte Anführungszeichen in Ihrer Datei ersetzen?
Wenn ich etwas nicht vermisse, würde nicht s/\'/"/g
funktionieren?
Sie haben die richtige Idee - Sie wollen "\1"
als Ihre Ersatzklausel haben, aber Sie müssen den "Hello There" -Teil in Fanggruppe 1 zuerst setzen (0 ist die gesamte Übereinstimmung). Versuchen:
:%/'\(.*\)'/"\1"
%s/'\([^']*\)'/"\1"/g
Sie [^']*
statt .*
sonst
'apples' are 'red'
-"apples' are 'red"
umgewandelt bekommen würde verwenden möchten
Oder verwenden Sie '. \ {-}' anstelle von '. *'. Siehe ': help/\ {-'. –
ist es auch surround.vim, wenn Sie schauen, um mach das ziemlich oft. Sie würden cs'"
verwenden, um umgebende Anführungszeichen zu ändern.
Danke für den surround.vim Link - ich habe mir das schon lange gewünscht. – ThomasH
Gibt es eine Möglichkeit, dies einem Führerbefehl zuzuordnen? Ich kann es nicht tun: \ –
Sie sollten dies nicht zu einem Führungsbefehl zuordnen müssen, da es eine benutzerdefinierte 'cs' Bewegung mit zwei Argumenten verwendet -' '' als Ziel und '' 'als Ersatz: – kejadlen
Gerade FYI ein - alle doppelte Anführungszeichen mit Einzel zu ersetzen, ist dies der richtige regexp - basierend auf beispielsweise der rayd09 oben
:%s/"\([^"]*\)"/'\1'/g
Vorausgesetzt, Sie dies auf eine ganze Datei tun wollen ...
N-Modus:
ggvG$ [SHIFT+:]
X-Modus:
'<,'>/'/" [RET]
Das war mein Kompromiss, aber ich hatte das Gefühl, dass es nicht ganz richtig war, vor allem, wenn innerhalb des Attributs ein einzelnes Zitat vorlag. Ich denke nicht, dass dies in XML passieren kann, aber es könnte in einer anderen Situation passieren, die die gleiche Lösung benötigt. – ravuya
Ein einzelnes Anführungszeichen in einem einfach zitierten Attribut sollte ''' sein und ein Doppelzitat innerhalb eines doppelt zitierten Attributs sollte '"' sein. Natürlich könnte ein einzelnes Zitat in einem doppelt zitierten Attribut leben und umgekehrt ... – ephemient