2010-01-20 16 views
23

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

20

Sie müssen Gruppierungen verwenden:

:s/\'\(.*\)\'/\"\1\" 

Auf diese Weise Argument 1 (dh \ 1) entsprechen wird, was durch \ begrenzt wird (und \).

2

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?

5

Wenn ich etwas nicht vermisse, würde nicht s/\'/"/g funktionieren?

+0

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

+0

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

1

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"

13

%s/'\([^']*\)'/"\1"/g

Sie [^']* statt .* sonst

'apples' are 'red'-"apples' are 'red" umgewandelt bekommen würde verwenden möchten

+1

Oder verwenden Sie '. \ {-}' anstelle von '. *'. Siehe ': help/\ {-'. –

48

ist es auch surround.vim, wenn Sie schauen, um mach das ziemlich oft. Sie würden cs'" verwenden, um umgebende Anführungszeichen zu ändern.

+0

Danke für den surround.vim Link - ich habe mir das schon lange gewünscht. – ThomasH

+0

Gibt es eine Möglichkeit, dies einem Führerbefehl zuzuordnen? Ich kann es nicht tun: \ –

+0

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

6

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 
0

Vorausgesetzt, Sie dies auf eine ganze Datei tun wollen ...

N-Modus:

ggvG$ [SHIFT+:] 

X-Modus:

'<,'>/'/" [RET]