Puoi anche farlo con un Ex
comando usando sed
come filtro esterno:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Questa versione ignorerà (eliminerà) tutte le righe extra oltre un multiplo di 4. Per mantenere nell'ultima serie di meno di 4 righe (invertite), utilizzare:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
Il %
qui significa "Ogni riga nel buffer".
Il !
comando significa "Esegui il seguente comando con le righe specificate come input e sostituisci le righe specificate con l'output del comando". (Si chiama filtro; molto utile per cose come l'ordinamento, ad esempio, :%!sort
ordinerà tutte le linee nel tuo file; :2,8!sort
ordinerà le linee 2-8, ecc.)
sed
è lo strumento dell'editor di stream e si trova su tutti i sistemi simili a Unix. I concetti chiave sed
usati qui sono lo "spazio modello" (che per impostazione predefinita contiene a sua volta ciascuna riga dell'input) e lo "spazio trattenuto" (che è il punto in cui è possibile incollare del testo extra mentre lo si utilizza sed
per salvarlo mentre si elaborano altri linee di input).
-n
è un'opzione al sed
comando per sopprimere le sue azioni predefinite di stampa dello spazio modello (perché in questo caso vogliamo stampare solo quando lo diciamo esplicitamente).
$p
nel sed
comando significa "Se ti trovi nell'ultima riga sed
dell'input, stampa (lo spazio del motivo)."
h
significa "attaccare il contenuto corrente dello" spazio modello "nello" spazio di attesa ", sovrascrivendo qualsiasi cosa ci sia".
n
significa "sostituisci il contenuto dello" spazio modello "con la riga successiva dall'input."
G
significa "aggiungi allo" spazio modello ": una nuova riga seguita dal contenuto dello" spazio di attesa "."
Presi tutti insieme, il sed
comando memorizza quattro righe di output, invertendole mentre le memorizza e quindi le stampa. I $p
comandi aggiunti nella seconda versione assicurano che se viene raggiunta l'ultima riga del file se non su un multiplo di 4 righe, le linee vengono comunque stampate.
Per un approccio alternativo e interattivo, ancora senza l'utilizzo di funzionalità specifiche di Vim e anche senza l'utilizzo di un filtro esterno:
:4
per andare alla quarta riga.
:.m -4 | +3m . | +2m . | +5
per invertire le quattro righe precedenti (1-4) e lasciare il cursore sulla riga 8.
.m -4
sposta la riga corrente subito dopo la riga di quattro righe indietro (lasciando il cursore sulla riga spostata).
+3m .
sposta la linea che è 3 linee dopo la linea corrente, subito dopo la linea corrente, lasciando il cursore sulla linea spostata. +2m .
ovviamente funziona allo stesso modo.
+5
posiziona il cursore a cinque righe dal punto in cui si trova.
Ripeti come desiderato.
In Vim puoi ripetere l'intero comando con @:
, quindi ripetere di nuovo con @@
. In POSIX vi
o ex
dovresti inserire :.m -4 | +3m . | +2m . | +5
una riga di testo, eliminarlo in un buffer con nome (registro), quindi eseguire quel buffer con nome (registro).
Pertanto, in ex
modalità, invertendo le righe in modo interattivo utilizzando solo le funzionalità specificate da POSIX e iniziando con 17 righe di testo:
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
Ulteriori letture: