Ci sono già tre grandi risposte in questa pagina, ma, come suggerito da Luc Hermitte in un commento , se stai facendo questo a sorpresa , la cosa importante è quanto velocemente e facilmente puoi trovare una soluzione funzionante.
In quanto tale, questo è un problema che non avrei usato :substitute
per niente: è uno che può essere facilmente risolto usando i normali comandi in modalità normale e una macro ricorsiva:
(Se necessario) Innanzitutto, disattivare 'wrapscan'
. L'espressione regolare che useremo corrisponderà al testo del risultato desiderato e al testo iniziale, quindi con 'wrapscan'
ON la macro continuerebbe a essere riprodotta per sempre. (O fino a quando non ti rendi conto di cosa sta succedendo e premi <C-C>
.):
:set nowrapscan
Imposta il termine di ricerca (utilizzando la stessa espressione regolare di base già menzionata nelle risposte esistenti):
/#\d\+\(\.\d\+\)\?<CR>
(Se necessario) Torna alla prima partita premendo N
tutte le volte necessarie,
(Se necessario) Cambia la prima corrispondenza nel testo desiderato:
cE#1<Esc>
Cancella il "q
registro e inizia a registrare una macro:
qqqqq
Yank il contatore corrente:
yiW
Vai alla prossima partita:
n
Sostituisci il contatore corrente con quello appena tirato:
vEp
Incrementa il contatore:
<C-A>
Riproduci macro q
. Il registro "q
è ancora vuoto perché l'abbiamo eliminato nel passaggio 5, quindi a questo punto non succede nulla:
@q
Interrompere la registrazione della macro:
q
Riproduci la nuova macro e guarda!
@q
Come per tutte le macro, questo appare come un sacco di passaggi quando spiegato come ho fatto sopra, ma nota che in realtà digitarli è molto veloce per me: a parte il ricorsivo-macro-registrazione-boilerplate sono tutti i normali comandi di modifica Sto eseguendo continuamente durante la modifica. L'unico passo in cui dovevo fare qualcosa anche avvicinandomi al pensiero era il passaggio 2, in cui ho scritto l'espressione regolare per eseguire la ricerca.
Formattato come due comandi in modalità riga di comando e una serie di sequenze di tasti, la velocità di questo tipo di soluzione diventa più chiara: posso evocare quanto segue abbastanza velocemente quanto posso scriverlo 1 :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
Probabilmente avrei potuto escogitare altre soluzioni in questa pagina con un po 'di pensiero e qualche riferimento alla documentazione 2 , ma, una volta capito come funzionano le macro, sono davvero facili da sfornare a qualsiasi velocità tu modifichi di solito.
1: Ci sono situazioni in cui le macro richiedono più riflessioni, ma trovo che in pratica non escano molto. E generalmente le situazioni in cui si verificano sono quelle in cui una macro è l' unica soluzione pratica.
2: Non implicare che gli altri risponditori non avrebbero potuto trovare le loro soluzioni in modo simile facilmente: hanno solo bisogno di abilità / conoscenze che personalmente non ho così facilmente a portata di mano. Ma tutti gli utenti di Vim sanno come usare i normali comandi di modifica!
perldo
, puoi usare:%perldo s/#\K\d+(\.\d+)?/++$i/ge