Il y a déjà trois bonnes réponses sur cette page, mais, comme l'a suggéré Luc Hermitte dans un commentaire , si vous faites cela au pied levé, l'important est la rapidité et la facilité avec laquelle vous pouvez trouver une solution de travail.
En tant que tel, c'est un problème que je n'utiliserais pas :substitute
du tout: c'est un problème qui peut facilement être résolu en utilisant des commandes normales en mode normal et une macro récursive:
(Si nécessaire) Tout d'abord, désactivez 'wrapscan'
. L'expression régulière que nous allons utiliser correspondra au texte de résultat souhaité ainsi qu'au texte initial, donc avec 'wrapscan'
on, la macro continuerait sinon à être lue pour toujours. (Ou jusqu'à ce que vous réalisiez ce qui se passe et appuyez sur <C-C>
.):
:set nowrapscan
Configurez votre terme de recherche (en utilisant la même expression régulière de base déjà mentionnée dans les réponses existantes):
/#\d\+\(\.\d\+\)\?<CR>
(Si nécessaire) Revenez au premier match en appuyant N
autant de fois que nécessaire,
(Si nécessaire) Remplacez la première correspondance par le texte souhaité:
cE#1<Esc>
Effacez le "q
registre et commencez à enregistrer une macro:
qqqqq
Tirez sur le compteur actuel:
yiW
Passez au match suivant:
n
Remplacez le compteur actuel par celui que nous venons de tirer:
vEp
Incrémentez le compteur:
<C-A>
Jouer la macro q
. Le registre "q
est toujours vide car nous l'avons effacé à l'étape 5, donc rien ne se passe à ce stade:
@q
Arrêtez l'enregistrement de la macro:
q
Jouez la nouvelle macro et regardez!
@q
Comme pour toutes les macros, cela ressemble à beaucoup d'étapes lorsque je l'explique comme je l'ai fait ci-dessus, mais notez qu'en fait, les saisir est très rapide pour moi: à part le récapitulatif-macro-enregistrement-passe-partout, ils ne sont que les habituels les commandes d'édition que j'exécute tout le temps pendant l'édition. La seule étape où j'ai dû faire quoi que ce soit même en approchant de la pensée était l'étape 2, où j'ai écrit l'expression régulière pour effectuer la recherche.
Formatée en deux commandes en mode ligne de commande et une série de frappes, la vitesse de ce type de solution devient plus claire: je peux évoquer les éléments suivants à peu près aussi vite que je peux taper 1 :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
J'aurais probablement pu trouver les autres solutions sur cette page avec un peu de réflexion et un certain référencement de la documentation 2 , mais, une fois que vous comprenez le fonctionnement des macros, elles sont vraiment faciles à produire à la vitesse que vous modifiez habituellement.
1: Il y a des situations où les macros nécessitent plus de réflexion, mais je trouve qu'elles n'apparaissent pas beaucoup dans la pratique. Et généralement, les situations où elles se produisent sont celles où une macro est la seule solution pratique.
2: Cela ne veut pas dire que les autres répondeurs n'auraient pas pu trouver leurs solutions de la même manière: ils ont juste besoin de compétences / connaissances que je n'ai pas si facilement à portée de main. Mais tous les utilisateurs de Vim savent utiliser les commandes d'édition habituelles!
perldo
, vous pouvez utiliser:%perldo s/#\K\d+(\.\d+)?/++$i/ge