Tengo varias líneas en un archivo, y me gustaría copiar cada línea 11 veces (convirtiendo cada línea en 12 líneas) e incrementar el último "1" en cada línea para que las 12 líneas tengan "1" a " 12 ", donde inicialmente estaba el" 1 ". Puede haber otras ocurrencias de "1" en cada línea, pero el "1" que deseo incrementar siempre será la última aparición en cada línea. Otra forma de verlo es que el último "1" siempre es después de "/ nt /", como en "/ nt / 1" (y siempre será la única aparición de "/ nt / 1" en cada línea) .
Entonces, por ejemplo, si tengo:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Quiero convertirlo en:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
Anteriormente había encontrado el comando:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
funciona para este propósito, pero tendría que ejecutar manualmente este comando para cada línea y escribir cada línea (o copiar y pegar) yo mismo. ¿Hay alguna manera de tomar las líneas que ya están en el archivo y simplemente ejecutar un comando que convierte cada línea en doce, de la manera que he descrito?
Gracias de antemano a cualquiera que pueda ayudarme con esto. También quería señalar que esta es mi segunda pregunta aquí, y me complació haber obtenido varias soluciones rápidas y efectivas a mi primera pregunta, por lo cual estaba muy agradecido.
fuente
Podrías hacer esto por
global
comando ex para ejecutar la macro n número de veces para cada línea en el archivo.Después de grabar la macro, deshaga los cambios realizados durante la grabación, o habrá n + 1 líneas adicionales para la primera línea yn para líneas consecutivas.
Grabe la macro en el
a
registro conEsto registra en register
a
(qa...q
) el siguiente comando:yyp
: duplicar la línea actual$
: mover al final de la línea?\d<CR>
: busca hacia atrás un solo dígito<C-A>
: incrementa el dígito debajo del cursor en unoCuando se graba la macro, elimine los cambios realizados mientras la graba deshaciendo (
uu
) o eliminando la línea actual (dd
). Luego repita la macro11
(o cualquier cantidad de) veces para cada línea en el archivo con el comando global:fuente
Dos caminos:
¡Usa una macro!
Empezando con
Con el cursor en la primera línea.
Que hace:
qq
Comience a grabar una macro en el registro qyyp
tira de la línea actual y pégala debajo$?\d<CR>
Ve al final de la línea y encuentra el primer dígito mirando hacia atrás<Ctrl-a>
Incrementar el númeroq
Deja de grabar la macro.Esto te deja con:
Con el cursor en la segunda línea. Simplemente repita esta macro tantas veces como desee (por ejemplo, repítala diez veces con 10 @ q). Si desea automatizar este proceso para cada línea, ejecútelo globalmente en cada línea:
:g//normal 11@q
Alternativamente, con una versión más nueva de vim: pegue la línea que desee sin importar cuántas veces, bloque visual seleccione el dígito que desea incrementar y presione
g <Ctrl-a>
. Esto debería incrementar todos los números en el bloque visual como desee. Sin embargo, este es un proceso más manual.fuente
g <c-a>
camino. Gracias por compartir.Me resulta más fácil usar macros para tareas de una sola vez como esa. Simplemente comience a grabar una macro con
q
+ nombre de registro y realice la tarea una vez. Veo una tarea repetible aquí:Ahora grabe las pulsaciones de teclas necesarias para registrarse
a
, en modo normal:Elimine la línea nuevamente para probar si ejecutar la macro 11 veces produce el resultado correcto para una línea:
¡Lo hace! Así que vamos a deshacer nuevamente y automatizar todo el proceso en una segunda macro
b
:Ahora puede ejecutar
@b
hasta el final del archivo y debería producir la salida que desea. Suena complicado, pero en realidad no lo es una vez que estás acostumbrado a los patrones de edición típicos.fuente
qaVyp$b<c-a>
. O mejor, soloqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
de @fruglemonkey y @jjaderberg es mejor ya que busca el último número. Lo cambiaré por completo.Guarde la siguiente macro y úsela para cada línea:
La principal diferencia con respecto a las otras respuestas es que esto se utiliza
g<C-a>
en una selección de columna que incrementa cada línea con un número diferente. Consulte:help v_g_CTRL-A
para más información. También he usado\zs
para seleccionar la posición de inicio del patrón, de modo que el cursor se detenga en el número después de la búsqueda.Tenga en cuenta que necesita una versión reciente de Vim para que esto funcione.
fuente
g<C-a>
que @fruglemonkey y usted mencionó, pero gracias por responder. Debo tener en cuenta que al probar su macro, justo antes de llegar a lag<C-a>
parte, no es el último carácter "1" que estoy buscando incrementar lo que se resalta en bloque, sino que es el carácter antes del primer "1" "personaje que se resalta en bloque. (Además, creo que habría sido asíyy11p
y10j
en la macro, ya que estoy buscando agregar 11 líneas, para un total de 12.)\zs
, pero podría simplemente haber agregado unl
after<CR>
.vim -u NONE
. ¡Acabo de hacer eso y funciona perfectamente! De hecho, no hay forma de que la búsqueda coincida con el primer 1 porque requiere una barra inclinada anterior.