Sie können dies auch mit einem ExBefehl tun , der sedals externen Filter verwendet wird:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Diese Version ignoriert (löscht) alle zusätzlichen Zeilen, die ein Vielfaches von 4 überschreiten. Um den letzten Satz von weniger als 4 Zeilen (umgekehrt) beizubehalten, verwenden Sie:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
Das %hier bedeutet "Jede Zeile im Puffer".
Der !Befehl bedeutet "Führen Sie den folgenden Befehl mit den angegebenen Zeilen als Eingabe aus und ersetzen Sie die angegebenen Zeilen durch die Ausgabe des Befehls." (Es wird als Filter bezeichnet. Sehr praktisch, wenn Sie beispielsweise sortieren, um beispielsweise :%!sortalle Zeilen in Ihrer Datei zu :2,8!sortsortieren, oder um die Zeilen 2 bis 8 usw. zu sortieren.)
sedist das Stream-Editor- Tool und ist auf allen Unix-ähnlichen Systemen zu finden. Die wichtigsten hier verwendeten Konzepte sedsind der "Musterbereich" (der standardmäßig nur die einzelnen Zeilen der Eingabe enthält) und der "Haltebereich" (in dem Sie zusätzlichen Text sedeinfügen können, während Sie ihn speichern, während Sie andere verarbeiten) Eingabezeilen).
-nist eine Option für den sedBefehl, um seine Standardaktionen zum Drucken des Musterbereichs zu unterdrücken (da wir in diesem Fall nur drucken möchten, wenn wir dies ausdrücklich sagen.)
$pim sedBefehl bedeutet "Wenn Sie in der letzten Zeile der sedEingabe sind, drucken Sie (das Muster Leerzeichen)."
h bedeutet "den aktuellen Inhalt des 'Pattern Space' in den 'Hold Space' stecken und überschreiben, was auch immer da ist."
n bedeutet "Ersetzen Sie den Inhalt des 'Musterraums' durch die nächste Zeile der Eingabe."
G bedeutet "an den 'Musterraum' anhängen: eine neue Zeile, gefolgt vom Inhalt des 'Halteraums'."
Insgesamt sedspeichert der Befehl vier Ausgabezeilen, kehrt sie beim Speichern um und druckt sie dann aus. Die $pin der zweiten Version hinzugefügten Befehle stellen sicher, dass die Zeilen weiterhin gedruckt werden, wenn die letzte Zeile der Datei anders als in einem Vielfachen von 4 Zeilen erreicht wird.
Für einen alternativen, interaktiven Ansatz, bei dem noch keine Vim-spezifischen Funktionen und auch kein externer Filter verwendet werden:
:4
in die vierte Zeile gehen.
:.m -4 | +3m . | +2m . | +5
Um die vorherigen vier Zeilen (1-4) umzukehren und den Cursor in Zeile 8 zu lassen.
.m -4Verschiebt die aktuelle Zeile um vier Zeilen nach der Zeile zurück (wobei der Cursor auf der verschobenen Zeile verbleibt).
+3m .Verschiebt die Zeile, die 3 Zeilen nach der aktuellen Zeile liegt, direkt nach der aktuellen Zeile, wobei der Cursor auf der verschobenen Zeile verbleibt. +2m .funktioniert natürlich genauso.
+5 Platziert den Cursor fünf Zeilen nach unten.
Wiederholen Sie diesen Vorgang wie gewünscht.
In Vim können Sie den gesamten Befehl mit @:und anschließend mit wiederholen @@. In POSIX vioder müssen exSie als Textzeile einfügen :.m -4 | +3m . | +2m . | +5 , löschen Sie es in einen benannten Puffer (Register) und führen Sie dann diesen benannten Puffer (Register) aus.
Im exModus können Sie also Zeilen interaktiv umkehren, indem Sie nur von POSIX angegebene Features verwenden und mit 17 Textzeilen beginnen:
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
Weitere Lektüre: