Sie können dies auch mit einem Ex
Befehl tun , der sed
als 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 :%!sort
alle Zeilen in Ihrer Datei zu :2,8!sort
sortieren, oder um die Zeilen 2 bis 8 usw. zu sortieren.)
sed
ist das Stream-Editor- Tool und ist auf allen Unix-ähnlichen Systemen zu finden. Die wichtigsten hier verwendeten Konzepte sed
sind der "Musterbereich" (der standardmäßig nur die einzelnen Zeilen der Eingabe enthält) und der "Haltebereich" (in dem Sie zusätzlichen Text sed
einfügen können, während Sie ihn speichern, während Sie andere verarbeiten) Eingabezeilen).
-n
ist eine Option für den sed
Befehl, 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.)
$p
im sed
Befehl bedeutet "Wenn Sie in der letzten Zeile der sed
Eingabe 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 sed
speichert der Befehl vier Ausgabezeilen, kehrt sie beim Speichern um und druckt sie dann aus. Die $p
in 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 -4
Verschiebt 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 vi
oder müssen ex
Sie 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 ex
Modus 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: