Conseguir texto que está en una línea diferente, con ex en Vim
Pregunta
Vamos a decir que tengo el siguiente texto en Vim:
file1.txt
file2.txt
file3.txt
renamed1.txt
renamed2.txt
renamed3.txt
Quiero una transformación de la siguiente manera:
file1.txt renamed1.txt
file2.txt renamed2.txt
file3.txt renamed3.txt
Lo que tengo en mente es algo como lo siguiente:
:1,3 s/$/ <the text that is 4 lines below this line>
Me tengo que quedar con la forma de especificar la parte <the text that is 4 lines below this line>
.
He intentado algo así como .+4
(4 líneas por debajo de la línea actual), pero en vano.
Solución
Puede hacerlo con el corte en forma de bloques y pegar.
1) Insertar espacio en el inicio de cada línea "renombrado", por ejemplo, :5,7s/^/ /
2) Uso en forma de bloques selección visual (ctrl-v
) para seleccionar todas las líneas "archivo", y pulse d
para eliminarlos
3) el uso por bloques selección visual de nuevo para seleccionar el carácter de espacio en el inicio de todas las líneas cambiado el nombre y pulse p
. Esto pegará la línea correspondiente del bloque que eliminó al comienzo de cada línea.
Otros consejos
:1,3:s/\ze\n\%(.*\n\)\{3}\(.*\)/ \1
Explicación:
\ze - end of replaced part of match - the string matched by the rest of the pattern will not be consumed
\n - end of current line
\%(.*\n\)\{3} - next 3 lines
\(.*\) - content of 4th line from here
Esto dejará las líneas posteriores donde se encuentren.
Me haría una macro para esto realmente. Eliminar la línea inferior, moverse hacia arriba, pegar, líneas J
oin, a continuación, ejecutar la macro en los otros. El otro método, creo que sería apropiado es una secuencia de comandos independiente para actuar como un filtro.