Remplacer à l'aide de VIM, réutiliser une partie du modèle de recherche

29

Je travaille avec VImet j'essaie de configurer une commande de recherche et de remplacement pour effectuer des remplacements où je peux réutiliser l'expression 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 un nombre quelconque.

Je suis venu jusqu'ici

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

qui correspond exactement à la pièce que je veux.

Maintenant, le remplacement, j'ai essayé

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

Mais cela donne en sortie {(10)}

Ensuite, j'ai essayé

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

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

Je pense que j'ai besoin d'un autre type de marquage / référencement arrière au lieu de cela \0, mais je ne sais pas où chercher. La question est donc de savoir si cela peut se faire dans vim, et si oui, comment?

Bernhard
la source

Réponses:

37

\0est le match entier. Pour n'en utiliser qu'une partie, vous devez le définir comme ceci et utiliser \ 1

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

Vous trouverez des instructions plus détaillées ici ou dans l'aide de vim.

se ruer
la source
Notez que les parenthèses pour la capture sont échappées par une barre oblique inverse.
Randall
0

J'ai récemment hérité du code hérité et je voulais remplacer toutes les occurrences comme:

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

à

logging.info("xy") 

ou

logging.info(x,y)

En s'appuyant sur la réponse précédente et dans l'espoir que quelqu'un en bénéficiera, j'ai utilisé la commande suivante, qui changera toutes les occurrences:

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

Si vous substituez %avec .et retirez /gvous finirez avec

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

cela vous permettra de passer en revue chaque match et de choisir si vous le changez ou non.

yagad
la source
0

La meilleure façon de vous permettre de passer en revue chaque correspondance consiste à ajouter un «c» à la fin du code, plutôt que d'aller ligne par ligne

%s/print\( .*\)/logging.info\(\1\)/gc
Tim Rosenow
la source
Cela ne répond vraiment en rien à la question d'origine
Bernhard