Vim:使用多个模式进行排序

15

我知道在 vim 中,可以使用正则表达式来指定每行中要考虑排序的部分,以此来对文件进行排序:

:sort 'regex' r

能否将多个表达式结合起来?

这里有一个例子:

输入:

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

:按照字典序降序排序

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

期望的(可能是类似于:排序 '[A-Z]|[0-9]' r ?):

bar b 1
bar a 2
foo b 1
foo a 2
请注意,仅使用“sort”是无效的,因为其中的“a”和“b”会破坏数字的顺序。
bar a 2
bar b 1
foo a 2
foo b 1

除了VIM之外,还可以接受其他替代方案,但为了满足好奇心,我想知道在VIM内是否实际可行(如果是肯定的话,如何实现 ;-)

非常感谢, 敬礼


1
sort '[0-9]' r 的结果没有被正确粘贴。结果应该是不同的。 - Birei
@Birei:你说得对。我刚刚纠正了它。谢谢! - Carles Sala
感到困惑。第一块是输入的值吗?第二个似乎是针对 sort '[0-9]' r(假定第一个表示初始状态),而不是 sort '[a-z]' r,第三个是针对 sort '[a-z]' r(再次假定第一个是初始状态,且我们没有先运行其他排序),而不是 `sort '[0-9]' r。我想。也许你在 Birei 的评论后编辑了第二篇,但本意是编辑第三篇?而“EXPECTED”应该与“INTENDED”或“DESIRED”相近? - ruffin
2个回答

10
假设您已经有外部排序功能,以下内容应该可以正常工作:
:%!sort -k1,1 -k3,3n

编辑:解释:

-k 用于指定排序键。 -k1,1 表示从 key1 开始排序,以 key1 结束排序。 -k3,3n 表示从 key3 开始排序,以 key3 结束排序;这里的 n 表示数字排序,即按照字符串数值进行比较。

默认情况下,sort 假定空格到非空格转换为字段分隔符。因此,它会将行 bar b 1 视为三个字段。如果值由特定字符(而不是空格)分隔,比如说 :,您可以通过添加 -t: 来指定字段分隔符。


没错,这个可以用!不过,你能否解释一下这些参数的含义,这样我就可以轻松地将其扩展到不同的(真实的,这只是一个简化的例子)情况中了? - Carles Sala
@CarlesSala 请看上面的解释。 - devnull
这不就是在VIm中从命令行调用,将作为操作范围发送的吗?虽然显然对于OP有效,但对于Windows [除了Powershell]来说不太有用,并且不是一个真正的VIm答案,对吧?还是我错过了什么? - ruffin

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

按照这个顺序执行命令,您指定第一个单词优先于数字。


我没有看到缺陷...这种请求需要一个顺序是显而易见的,尽管我没有明确指定顺序,但我是隐含地这样做的(我说想使用两个规则,建议“[a-z] | [0-9]”,并贴上结果...)。 无论如何,你介意解释一下为什么你的建议有效吗? /\d/ 和 /[a-z]/ 实际上在做什么? - Carles Sala
\d 相当于 [0-9]。在这个上下文中,/.../ 相当于输入 '...'。我的语法可能是更“标准化”的方法,但你的方法也没有问题。它意思相同。如果你想节省一个按键,你也可以只输入 :sor 而不是 :sort - 但我没有让你感到困惑!缺陷在于 :sort 命令在每行中查找一个模式,然后根据该模式重新排序行。你正在寻找两个不同的模式,这超出了命令的范围(我认为。就我所知)。 - Tom Lord
但是,问题是,你要如何告诉vim按照列1而非列3进行排序,并忽略列2?我很确定那甚至不可能…何必费事呢,当你只需使用两个简单的命令就能轻松完成呢? - Tom Lord
好的,谢谢你的解释,汤姆。我没有考虑分两步来做,但这绝对是一个选项。然而,我选择了devnull的答案,因为它可以导出到vim之外(例如,在另一个命令之后进行管道传输)。 - Carles Sala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接