También puede hacer esto con un Excomando usando sedcomo filtro externo:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Esta versión ignorará (eliminará) cualquier línea adicional más allá de un múltiplo de 4. Para mantener el último conjunto de menos de 4 líneas (invertido), use:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
El %aquí significa "Cada línea en el búfer".
El !comando significa "Ejecutar el siguiente comando con las líneas especificadas como entrada y reemplazar las líneas especificadas con la salida del comando". (Se llama filtro; muy útil para cosas como ordenar, por ejemplo, :%!sortordenará todas las líneas en su archivo; :2,8!sortordenará las líneas 2-8, etc.)
sedes la herramienta de edición de flujo y se encuentra en todos los sistemas tipo Unix. Los conceptos clave de los sedutilizados aquí son el "espacio de patrón" (que por defecto solo contiene cada línea de la entrada) y el "espacio de retención" (que es donde puede pegar texto adicional mientras lo usa sedpara guardarlo mientras procesa otros líneas de entrada).
-nes una opción del sedcomando para suprimir sus acciones predeterminadas de imprimir el espacio del patrón (porque en este caso solo queremos imprimir cuando lo decimos explícitamente).
$pen el sedcomando significa "Si está en la última línea de sedentrada, imprima (el espacio del patrón)".
h significa "pegar el contenido actual del 'espacio de patrón' en el 'espacio de espera', sobrescribiendo lo que esté allí".
n significa "reemplazar el contenido del 'espacio de patrón' con la siguiente línea de la entrada".
G significa "anexar al 'espacio de patrón': una nueva línea seguida por el contenido del 'espacio de retención'".
En conjunto, el sedcomando almacena cuatro líneas de salida, las invierte a medida que las almacena y luego las imprime. Los $pcomandos agregados en la segunda versión aseguran que si se alcanza la última línea del archivo que no sea en un múltiplo de 4 líneas, las líneas aún se imprimirán.
Para un enfoque alternativo e interactivo aún sin usar ninguna característica específica de Vim y también sin usar un filtro externo:
:4
para ir a la cuarta línea.
:.m -4 | +3m . | +2m . | +5
para invertir las cuatro líneas anteriores (1-4) y dejar el cursor en la línea 8.
.m -4mueve la línea actual justo después de la línea cuatro líneas hacia atrás (dejando el cursor en la línea movida).
+3m .mueve la línea que está 3 líneas después de la línea actual, justo después de la línea actual, dejando el cursor en la línea movida. +2m .por supuesto funciona igual.
+5 coloca el cursor cinco líneas hacia abajo desde donde está.
Repita como lo desee.
En Vim puede repetir todo este comando con @:, luego repetir nuevamente con @@. En POSIX vio extendría que insertarlo :.m -4 | +3m . | +2m . | +5 como una línea de texto, eliminarlo en un búfer con nombre (registro) y luego ejecutar ese búfer con nombre (registro).
Entonces, en exmodo, invierte líneas interactivamente usando solo características especificadas por POSIX, y comenzando con 17 líneas de texto:
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
Otras lecturas: