Ya hay tres excelentes respuestas en esta página, pero, como sugirió Luc Hermitte en un comentario , si lo hace de manera espontánea, lo importante es qué tan rápido y fácil puede encontrar una solución que funcione.
Como tal, este es un problema que en realidad no usaría :substitute
para nada: es uno que se puede resolver fácilmente usando comandos normales de modo normal y una macro recursiva:
(Si es necesario) Primero, apague 'wrapscan'
. La expresión regular que vamos a utilizar coincidirá con el texto del resultado deseado, así como con el texto inicial, por lo que con 'wrapscan'
on, la macro continuaría reproduciéndose para siempre. (O hasta que se dé cuenta de lo que está sucediendo y presione <C-C>
):
:set nowrapscan
Configure su término de búsqueda (usando la misma expresión regular base ya mencionada en las respuestas existentes):
/#\d\+\(\.\d\+\)\?<CR>
(Si es necesario) Vuelva al primer partido presionando N
tantas veces como sea necesario,
(Si es necesario) Cambie la primera coincidencia en el texto deseado:
cE#1<Esc>
Borre el "q
registro y comience a grabar una macro:
qqqqq
Yank el contador actual:
yiW
Salta al siguiente partido:
n
Reemplace el contador actual con el que acabamos de extraer:
vEp
Incrementar el contador:
<C-A>
Jugar macro q
. El registro "q
todavía está vacío porque lo borramos en el paso 5, por lo que no sucede nada en este punto:
@q
Deja de grabar la macro:
q
¡Juega la nueva macro y mira!
@q
Al igual que con todas las macros, esto se parece a muchos pasos cuando se explica como lo he hecho anteriormente, pero tenga en cuenta que escribir esto realmente es muy rápido para mí: aparte de la placa repetitiva de grabación de macro, todos son los normales. comandos de edición que realizo todo el tiempo durante la edición. El único paso en el que tenía que hacer algo, incluso acercarme al pensamiento, era el paso 2, donde escribía la expresión regular para realizar la búsqueda.
Formateada como dos comandos de modo de línea de comandos y una serie de pulsaciones de teclas, la velocidad de este tipo de solución se vuelve más clara: puedo conjurar lo siguiente casi tan rápido como puedo escribirlo 1 :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
Probablemente podría haber encontrado las otras soluciones en esta página con un poco de reflexión y algunas referencias a la documentación 2 , pero, una vez que comprenda cómo funcionan las macros, son realmente fáciles de producir a la velocidad que normalmente edita.
1: No son situaciones en las que las macros requieren mayor reflexión, pero me parece que no suben mucho en la práctica. Y, en general, las situaciones en las que ocurren son aquellas en las que una macro es la única solución práctica.
2: No implica que los otros respondedores no podrían haber presentado sus soluciones de manera similar fácilmente: solo requieren habilidades / conocimientos que personalmente no tengo tan fácilmente a mi alcance. ¡Pero todos los usuarios de Vim saben cómo usar comandos de edición regulares!
perldo
, puede usar:%perldo s/#\K\d+(\.\d+)?/++$i/ge