También puede hacer esto con un Ex
comando usando sed
como 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, :%!sort
ordenará todas las líneas en su archivo; :2,8!sort
ordenará las líneas 2-8, etc.)
sed
es la herramienta de edición de flujo y se encuentra en todos los sistemas tipo Unix. Los conceptos clave de los sed
utilizados 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 sed
para guardarlo mientras procesa otros líneas de entrada).
-n
es una opción del sed
comando para suprimir sus acciones predeterminadas de imprimir el espacio del patrón (porque en este caso solo queremos imprimir cuando lo decimos explícitamente).
$p
en el sed
comando significa "Si está en la última línea de sed
entrada, 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 sed
comando almacena cuatro líneas de salida, las invierte a medida que las almacena y luego las imprime. Los $p
comandos 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 -4
mueve 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 vi
o ex
tendrí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 ex
modo, 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: