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
Vous devez utiliser des groupes:
:s/\'\(.*\)\'/\"\1\"
Cet argument moyen 1 (c.-à-\ 1) correspondra à tout ce qui est délimité par \ (et \).
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?
à moins que je me manque quelque chose, ne serait pas s/\'/"/g
travail?
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"
%s/'\([^']*\)'/"\1"/g
Vous voulez utiliser [^']*
au lieu de .*
autrement
'apples' are 'red'
obtiendriez converti en "apples' are 'red"
Ou utilisez '\. {-}' au lieu de '' *.. Voir ': help/\ {-'. –
Il y a aussi surround.vim, si vous cherchez à faites-le assez souvent. Vous utiliseriez cs'"
pour modifier les devis environnants.
Merci pour le lien surround.vim - je le souhaitais depuis longtemps. – ThomasH
est-il un moyen de mapper cela à une commande de chef? Je ne peux pas arriver à le faire: \ –
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
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
présumant que vous voulez faire cela sur un dossier complet ...
N mode:
ggvG$ [SHIFT+:]
mode X:
'<,'>/'/" [RET]
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
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