Możesz to również zrobić za pomocą Ex
polecenia używanego sed
jako filtr zewnętrzny:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Ta wersja zignoruje (usunie) wszelkie dodatkowe wiersze poza wielokrotnością 4. Aby pozostać w ostatnim zestawie mniej niż 4 wiersze (odwrócone), użyj:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
%
Tutaj oznacza „każda linia w buforze.”
Te !
środki polecenia „Uruchom następujące polecenie z określonymi liniami jako wejście, a zastąpić określone wiersze z wyjściem polecenia.” (Nazywa się to filtrem; bardzo przydatny do takich rzeczy jak sortowanie, np. :%!sort
Sortuje wszystkie linie w twoim pliku; :2,8!sort
sortuje linie 2-8 itp.)
sed
jest narzędziem do edytowania strumieni i można go znaleźć we wszystkich systemach uniksopodobnych. Kluczowymi pojęciami sed
stosowanymi tutaj są „przestrzeń wzorca” (która domyślnie zawiera po prostu każdy wiersz danych wejściowych po kolei) oraz „przestrzeń wstrzymania” (gdzie można wstawić dodatkowy tekst, używając go sed
do zapisania go podczas przetwarzania innych wiersze wprowadzania).
-n
jest opcją dla sed
polecenia, aby ukryć jego domyślne działania drukowania przestrzeni wzorców (ponieważ w tym przypadku chcemy drukować tylko wtedy, gdy wyraźnie to mówimy).
$p
w sed
poleceniu oznacza „Jeśli znajdujesz się w ostatnim wierszu sed
wejścia, wydrukuj (przestrzeń wzorów).”
h
oznacza „przykleić bieżącą zawartość„ przestrzeni wzorów ”do„ przestrzeni wstrzymania ”, zastępując wszystko, co tam jest”.
n
oznacza „zamień zawartość„ przestrzeni wzorów ”na następny wiersz z danych wejściowych.”
G
oznacza „dołącz do„ przestrzeni wzorów ”: nowa linia, po której następuje treść„ przestrzeni wstrzymania ”.
Podsumowując, sed
polecenie przechowuje cztery wiersze danych wyjściowych, odwracając je podczas przechowywania, a następnie drukuje. Te $p
polecenia dodane w drugiej wersji zapewniają, że jeśli ostatni wiersz pliku zostanie osiągnięty inny niż na wielokrotność 4 linie, linie są nadal drukowane.
Dla alternatywnego, interaktywnego podejścia wciąż bez użycia funkcji specyficznych dla Vima, a także bez użycia zewnętrznego filtra:
:4
przejść do czwartej linii.
:.m -4 | +3m . | +2m . | +5
aby odwrócić poprzednie cztery linie (1-4) i pozostawić kursor w linii 8.
.m -4
przesuwa bieżącą linię do tuż po linii cztery linie wstecz (pozostawiając kursor na przesuniętej linii).
+3m .
przesuwa linię, która jest 3 linie za bieżącą linią, tuż za bieżącą linią, pozostawiając kursor na przesuniętej linii. +2m .
oczywiście działa tak samo.
+5
ustawia kursor pięć linii w dół od miejsca, w którym się znajduje.
Powtórz w razie potrzeby.
W Vimie możesz powtórzyć to polecenie za pomocą @:
, a następnie powtórzyć za pomocą @@
. W POSIX vi
lub ex
ciebie musiałby włożyć :.m -4 | +3m . | +2m . | +5
w postaci linii tekstu, usuń ją do określonego bufora (rejestru), a następnie wykonać tę nazwie bufora (rejestr).
Tak więc w ex
trybie interaktywne odwracanie wierszy tylko przy użyciu funkcji określonych przez POSIX i rozpoczynanie od 17 wierszy tekstu:
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
Dalsza lektura: