14

我知道,在 vim 中,我可以使用正则表达式对文件进行排序,以指示在排序时要使用的每一行的哪些部分:

:sort 'regex' r

是否可以组合多个表达式?

这里有一个例子:

输入:

bar a 2
foo b 1
bar b 1
foo a 2

:sort '[az]' r

foo b 1
bar b 1
bar a 2
foo a 2

排序 '[0-9]' r

bar a 2
bar b 1
foo b 1
foo a 2

预期(可能是“类似”的东西:sort '[AZ]|[0-9]' r ?):

bar b 1
bar a 2
foo b 1
foo a 2

请注意,由于“a”和“b”破坏了数字顺序,因此单纯的“排序”不起作用

bar a 2
bar b 1
foo a 2
foo b 1

VIM 之外的替代方案也被接受,但是,出于好奇,我想知道是否真的可以在 VIM 中做到这一点(如果是发酵的,如何;-)

非常感谢,问候

4

2 回答 2

10

假设您有可用的外部排序,以下应该可以工作:

:%!sort -k1,1 -k3,3n

编辑:说明:

-k用于指定排序键。 -k1,1意味着开始排序key1并结束它key1-k3,3n意味着开始排序key3并结束它key3n这里表示数字排序,即按照字符串数值进行比较。

默认情况下, sort 假定空白到非空白转换作为字段分隔符。因此,它会认为该行bar b 1由三个字段组成。如果值由空格以外的特定字符分隔,例如:,您可以通过添加来指定字段分隔符-t:

于 2013-07-02T07:35:37.800 回答
2

你所要求的有一个缺陷......如果你想按第一个单词和数字排序,那么你需要以某种方式指定优先顺序。换句话说,您是否希望排序列表看起来像这样:

bar b 1
bar a 2
foo b 1
foo a 2

或这个:

bar b 1
foo b 1
bar a 2
foo a 2

显然,答案是第一个。但是你需要告诉 vim !因此,我想不出任何(明智的)方法可以在一个命令中做到这一点......但是,我可以分两个来做到:

:sort /\d/ r
:sort /[a-z]/ r

通过按此顺序执行命令,您可以指定第一个单词优先于数字。

于 2013-07-02T09:31:00.680 回答