J'ai quelque chose qui ressemble à <Foobar Name='Hello There'/>
et j'ai besoin de changer les guillemets simples en guillemets doubles. J'ai essayé :s/\'.*\'/\"\0\"
mais il a fini par produire <Foobar Name="'Hello There'"/>
. Le remplacement de \0
par \1
n'a généré qu'une chaîne vide entre guillemets. Existe-t-il une syntaxe spéciale qui me manque et qui oblige à créer uniquement la chaîne trouvée ("Hello There") entre les guillemets et \1
?
Vous devez utiliser des groupements:
:s/\'\(.*\)\'/\"\1\"
De cette façon, l’argument 1 (c’est-à-dire\1) correspondra à tout ce qui est délimité par\(et \).
Il y a aussi surround.vim , si vous cherchez à le faire assez souvent. Vous utiliseriez cs'"
pour modifier les guillemets environnants.
%s/'\([^']*\)'/"\1"/g
Vous voudrez utiliser [^']*
au lieu de .*
sinon
'apples' are 'red'
serait converti en "apples' are 'red"
à moins que quelque chose me manque, s/\'/"/g
ne fonctionnerait-il pas?
Juste un FYI - pour remplacer tous les guillemets doubles par des guillemets simples, il s’agit de l’expression rationnelle correcte - basée sur l’exemple de rayd09 ci-dessus
:%s/"\([^"]*\)"/'\1'/g
Vous devez placer des crochets autour de la partie de l'expression que vous souhaitez capturer.
s/\'\(.*\)\'/"\1"/
Mais, vous pourriez avoir des problèmes avec la correspondance non intentionnelle. Pourriez-vous simplement remplacer les guillemets simples par des guillemets doubles dans votre fichier?
Vous avez la bonne idée - vous voulez avoir "\1"
comme clause de remplacement, mais vous devez commencer par placer la partie "Hello There" dans le groupe de capture 1 (0 est la correspondance complète). Essayer:
:%/'\(.*\)'/"\1"
En supposant que vous souhaitiez le faire sur un fichier entier ...
Mode N:
ggvG$ [SHIFT+:]
Mode X:
'<,'>/'/" [RET]