星期二, 三月 03, 2020

VIM学习笔记 文本排序(sort)

Vim内置了针对文本进行排序的:sort命令。你可以使用:help :sort命令,查看详细的帮助信息。

请注意,Vim内置的sort命令与Linux系统下的!sort命令并非完全一致。

文本行排序

使用以下命令,可以针对指定行范围内的文本进行排序:

:3,16sort

如下图所示,将第3至16行内的CSS属性进行排序:

sort_range

在可视化模式下选中文本,然后执行以下命令可以对选择的文本进行排序:

:'<,'>sort

使用以下命令,将在排序时去除重复的行。对于重复的多行,将仅仅保留第一行,而其它的行将被删除。

:%sort u

使用以下命令,可以针对所有文本进行倒序排序:

:%sort!

使用以下命令,将按照数字进行排序:

:%sort n

组合以上命令,则可以按照数字倒序排序:

:%sort! n

sort_n

文本块排序

假设我们需要对以下文本进行排序。其中,每个条目是被“.KS”和“.KE”包围的文本块;而其定义的每个术语则是以“.IP”开头的多行文字。

sort_block_troff_file

如果我们希望按术语进行排序,那么可以通过合并行将文本块整合为一个整体,然后进行排序;稍后再重新拆分行,来恢复原有的文本格式。具体步骤如下:

1)将换行符替换为“@@”字符:

:g/^\.KS/,/^\.KE/-1s/$/@@/

.KS@@
.IP "TTY_ARGV" 2n@@
The command, specified as an argument vector,@@
that the TTY subwindow executes.@@
.KE
.KS@@
.IP "ICON_IMAGE" 2n@@
Sets or gets the remote image for icon's image.@@
.KE
.KS@@
.IP "XV_LABEL" 2n@@
Specifies a frame's header or an icon's label.@@
.KE
.KS@@
.IP "SERVER_SYNC" 2n@@
Synchronizes with the server once.@@
Does not set synchronous mode.@@
.KE 

2)以“.KS”和“.KE”作为首尾标记来合并行:

:g/^\.KS/,/^\.KE/j

.KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE
.KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE
.KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE
.KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE 
 

3)对文本排序:

:%sort

.KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE
.KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE 
.KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE
.KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE
 

4)将“@@ ”字符重新替换为换行符,以恢复原有格式:

:%s/@@ /^M/g

.KS
.IP "ICON_IMAGE" 2n
Sets or gets the remote image for icon's image.
.KE
.KS
.IP "SERVER_SYNC" 2n
Synchronizes with the server once.
Does not set synchronous mode.
.KE
.KS
.IP "TTY_ARGV" 2n
The command, specified as an argument vector,
that the TTY subwindow executes.
.KE
.KS
.IP "XV_LABEL" 2n
Specifies a frame's header or an icon's label.
.KE

通过以上全局替换命令和排序命令,对文档中的特定术语进行了排序,而且保持格式不变。请注意:

  • 为了缩短实例文字的长度,我们使用“...”来表示省略的文字;
  • 在第2步使用j命令合并行时,自动新增了一个空格;所以在第3步的替换命令中,需要查找“@@”字符以及紧随其后的一个空格;
  • 第4步命令中的“^M”,是使用Ctrl-VCtrl-M键输入的;如果Ctrl-V键已经被占用,那么可以使用Ctrl-Q键来替代。

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

没有评论:

发表评论