2010-01-20 9 views
23

J'ai quelque chose de semblable à <Foobar Name='Hello There'/> et ont besoin de changer les guillemets simples à guillemets doubles. J'ai essayé :s/\'.*\'/\"\0\" mais il a fini par produire <Foobar Name="'Hello There'"/>. Remplacement de la \0 avec \1 seulement produit une chaîne vide à l'intérieur des guillemets doubles - est-il une syntaxe particulière qui me manque que je dois faire que la chaîne trouvée (« Bonjour ») à l'intérieur des guillemets affecter à \1?Remplacer les guillemets autour des chaînes dans Vim?

Répondre

20

Vous devez utiliser des groupes:

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

Cet argument moyen 1 (c.-à-\ 1) correspondra à tout ce qui est délimité par \ (et \).

2

Vous devez mettre entre parenthèses autour de la partie de l'expression que vous souhaitez capturer.

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

Mais, vous pourriez avoir des problèmes avec l'appariement involontaire. Pourriez-vous simplement remplacer les guillemets simples par des guillemets dans votre fichier?

5

à moins que je me manque quelque chose, ne serait pas s/\'/"/g travail?

+0

C'était mon compromis, mais je sentais que ce n'était pas tout à fait raison, surtout s'il y avait une seule citation à l'intérieur de l'attribut. Je ne pense pas que cela puisse arriver en XML, mais cela pourrait arriver dans d'autres situations qui nécessitent la même solution. – ravuya

+0

Une seule citation à l'intérieur d'un attribut à guillemets simples devrait être ''' et une double citation à l'intérieur d'un attribut à guillemets doubles devrait être '"'. Bien sûr, une seule citation pourrait vivre dans un double attribut cité et vice versa ... – ephemient

1

Vous avez la bonne idée - vous voulez avoir "\1" comme clause de remplacement, mais vous devez d'abord mettre la partie "Hello There" dans le groupe de capture 1 (0 correspond à la totalité du match). Essayez:

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

13

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

Vous voulez utiliser [^']* au lieu de .* autrement

'apples' are 'red' obtiendriez converti en "apples' are 'red"

+1

Ou utilisez '\. {-}' au lieu de '' *.. Voir ': help/\ {-'. –

48

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

+0

Merci pour le lien surround.vim - je le souhaitais depuis longtemps. – ThomasH

+0

est-il un moyen de mapper cela à une commande de chef? Je ne peux pas arriver à le faire: \ –

+0

Vous ne devriez pas avoir besoin de mapper ceci à une commande leader, car elle utilise un mouvement 'cs' personnalisé avec deux arguments -' '' comme cible, et '" 'comme le – kejadlen

6

Juste un FYI - pour remplacer tous les guillemets doubles avec simple, cela est correct regexp - basé sur l'exemple de rayd09 ci-dessus

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

présumant que vous voulez faire cela sur un dossier complet ...

N mode:

ggvG$ [SHIFT+:] 

mode X:

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