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