Ви також можете це зробити за допомогою Ex
команди, яка використовується sed
як зовнішній фільтр:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Ця версія буде ігнорувати (видаляти) будь-які додаткові рядки, що перевищують кратне число 4. Щоб зберегти в останньому наборі менше 4 рядків (перевернутий), використовуйте:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
%
Тут означає «Кожну рядок в буфері.»
У !
засобі командного «Виконайте наступну команду з заданими лініями в якості вхідних даних, і замінити зазначені рядки з висновком команди.» (Це називається фільтр; дуже зручно для таких речей, як сортування, наприклад, :%!sort
сортуватиме всі рядки у вашому файлі; :2,8!sort
буде сортувати рядки 2-8 тощо).
sed
є інструментом редактора потоків і знаходиться у всіх системах, схожих на Unix. Ключові поняття, sed
які тут використовуються, - це "простір шаблону" (який за замовчуванням просто містить кожен рядок вводу по черзі) та "утримувати пробіл" (саме там ви можете вставити додатковий текст, використовуючи sed
для збереження його під час обробки інших рядки введення).
-n
є опцією для sed
команди, щоб придушити свої типові дії друку простору шаблону (тому що в цьому випадку ми хочемо друкувати лише тоді, коли явно так сказамо.)
$p
в sed
команді означає "Якщо ви знаходитесь в останньому рядку введення sed
', надрукуйте (пробіл шаблону)."
h
означає "вставити поточний вміст" простору шаблону "у" простір утримування ", перезаписавши все, що там є".
n
означає "замінити вміст" простору шаблону "на наступний рядок із введення."
G
означає "додати до" простору шаблону ": новий рядок з подальшим вмістом" пробілу "."
У сукупності sed
команда зберігає чотири рядки виводу, реверсує їх у міру їх зберігання, а потім роздруковує. Ці $p
команди , додані в другій версії переконатися , що якщо останній рядок файлу досягається за винятком на кратному 4 лінії, лінії по - , як і раніше друкуються.
Для альтернативного інтерактивного підходу без використання будь-яких функцій Vim, а також без використання зовнішнього фільтра:
:4
перейти до четвертого рядка.
:.m -4 | +3m . | +2m . | +5
щоб змінити попередні чотири рядки (1-4) та залишити курсор у рядку 8.
.m -4
переміщує поточний рядок безпосередньо після рядка чотирьох рядків назад (залишаючи курсор на переміщеній лінії).
+3m .
переміщує лінію, що знаходиться на 3 рядки після поточної лінії, до одразу після поточного рядка, залишаючи курсор на переміщеній лінії. +2m .
звичайно працює так само.
+5
розміщує курсор на п’ять рядків вниз від місця, де він знаходиться.
Повторіть за бажанням.
У Vim ви можете повторити всю цю команду @:
, а потім повторити ще раз з @@
. У POSIX vi
або ex
вам потрібно буде вставити текст :.m -4 | +3m . | +2m . | +5
як рядок тексту, видаліть його з названим буфером (регістром), а потім виконайте цей іменований буфер (регістр).
Тож у ex
режимі реверсуються рядки в інтерактивному режимі, використовуючи лише визначені POSIX функції та починаючи з 17 рядків тексту:
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
Подальше читання: