Вы также можете сделать это с помощью 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
Дальнейшее чтение: