Remplacez à laide de VIM, réutilisez une partie du modèle de recherche

Je travaille avec VIm et jessaie de configurer un rechercher et remplacer la commande pour faire des remplacements où je peux réutiliser lexpression régulière qui fait partie de ma chaîne de recherche.

Un exemple simple serait une ligne où je veux remplacer (10) à {10}, où 10 peut être nimporte quel nombre.

Je suis arrivé jusquici

 .s/([0-9]*)/what here??/ 

qui correspond exactement à la partie que je veux.

Maintenant le remplacement, jai essayé

 .s/([0-9]*)/{\0}/ 

Mais, cela donne comme sortie {(10)}

Ensuite, jai essayé

 .s/(\zs[0-9]*\ze)/{\0}/ 

Cependant, cela a donné me ({10}), que je ferme également, mais pas ce que je veux.

Je pense que jai besoin dun autre type de marquage / rétro-référencement au lieu de ce \0, mais je ne sais pas où chercher. La question est donc de savoir si cela peut être fait dans vim, un Si oui, comment?

Réponse

\0 est la correspondance complète. Pour nen utiliser quune partie, vous devez le définir comme ceci et utiliser \ 1

.s/(\([0-9]*\))/{\1}/ 

Des instructions plus détaillées peuvent être trouvées ici ou dans laide de vim.

Commentaires

  • Notez que les parenthèses pour la capture sont échappées par une barre oblique inverse.

Réponse

Jai récemment hérité dun ancien code et je voulais remplacer toutes les occurrences telles que:

print "xx" print x,y print "xx" 

à

logging.info("xy") 

ou

logging.info(x,y) 

En me basant sur la réponse précédente et dans lespoir que quelquun en bénéficiera, jai utilisé la commande suivante, qui modifiera toutes les occurrences:

%s/print\( .*\)/logging.info\(\1\)/g 

Si vous remplacez % par . et supprimez /g vous vous retrouverez avec

.s/print\( .*\)/logging.info\(\1\) 

qui vous permettra de passer chaque correspondance et choisissez si vous la modifiez ou non.

Réponse

La meilleure façon de vous permettre de parcourir chaque correspondance est de ajoutez un « c » à la fin du code, plutôt que daller ligne par ligne

%s/print\( .*\)/logging.info\(\1\)/gc 

Commentaires

  • Cela ne ' répondre en aucune façon à la question initiale

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *