web-dev-qa-db-fra.com

Remplacer les guillemets autour des chaînes dans Vim?

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?

26
ravuya

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 \). 

22
rui

Il y a aussi surround.vim , si vous cherchez à le faire assez souvent. Vous utiliseriez cs'" pour modifier les guillemets environnants.

56
kejadlen

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

Vous voudrez utiliser [^']* au lieu de .* sinon

'apples' are 'red' serait converti en "apples' are 'red"

13
rayd09

à moins que quelque chose me manque, s/\'/"/g ne fonctionnerait-il pas?

6
tosh

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
6
BandsOnABudget

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?

2
martin clayton

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"

1
Josh

En supposant que vous souhaitiez le faire sur un fichier entier ... 

Mode N:

ggvG$ [SHIFT+:]  

Mode X:

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