您也可以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
表示“用输入的下一行替换'pattern space'的内容”。
G
表示“附加到'模式空间':换行符,后跟'保持空间'的内容。”
总而言之,该sed
命令存储了四行输出,在存储它们时将它们反转,然后打印它们。$p
第二个版本中添加的命令可确保,如果到达文件的最后一行而不是四行的倍数,则仍将打印这些行。
对于另一种交互式方法,仍然不使用任何特定于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
进一步阅读: