wake-up-neo.com

Anführungszeichen um Zeichenfolgen in Vim ersetzen?

Ich habe etwas Ähnliches wie <Foobar Name='Hello There'/> und muss die einfachen Anführungszeichen in doppelte Anführungszeichen ändern. Ich habe :s/\'.*\'/\"\0\" ausprobiert, aber am Ende wurde <Foobar Name="'Hello There'"/> erzeugt. Das Ersetzen von \0 durch \1 ergab nur eine leere Zeichenfolge in Anführungszeichen. Gibt es eine spezielle Syntax, die fehlt, damit nur die gefundene Zeichenfolge ("Hallo") in den Anführungszeichen zu \1 hinzugefügt wird?

26
ravuya

Sie müssen Gruppierungen verwenden:

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

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

22
rui

Es gibt auch surround.vim , wenn Sie dies ziemlich oft machen wollen. Sie würden cs'" verwenden, um die Anführungszeichen zu ändern.

56
kejadlen

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

Ansonsten möchten Sie [^']* anstelle von .* verwenden

'apples' are 'red' würde in "apples' are 'red" konvertiert

13
rayd09

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

6
tosh

Nur ein FYI - um alle Anführungszeichen durch einfache Anführungszeichen zu ersetzen, ist dies der richtige reguläre Ausdruck - basierend auf dem obigen Beispiel von rayd09

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

Sie müssen runde Klammern um den Teil des Ausdrucks setzen, den Sie erfassen möchten.

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

Möglicherweise haben Sie jedoch Probleme mit einem unbeabsichtigten Abgleich. Könnten Sie einzelne Anführungszeichen einfach durch Anführungszeichen in Ihrer Datei ersetzen?

2
martin clayton

Sie haben die richtige Idee - Sie möchten "\1" als Ersetzungsklausel verwenden, aber Sie müssen den Teil "Hallo dort" zuerst in Erfassungsgruppe 1 einfügen (0 ist die gesamte Übereinstimmung). Versuchen:

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

1
Josh

Vorausgesetzt, Sie möchten dies für eine gesamte Datei tun ... 

N-Modus:

ggvG$ [SHIFT+:]  

X-Modus:

'<,'>/'/" [RET]
0
Eddie B