首页 > 解决方案 > bash 排序字母数字版本号

问题描述

我有一个从我的构建服务器获得的构建编号列表,如下所示:

1.0.0.b1
1.0.0.b10
1.0.0.b11
1.0.0.b12
1.0.0.b13
1.0.0.b14
1.0.0.b15
1.0.0.b16
1.0.0.b17
1.0.0.b18
1.0.0.b19
1.0.0.b2
1.0.0.b20
1.0.0.b21
1.0.0.b22
1.0.0.b3
1.0.0.b4
1.0.0.b5
1.0.0.b6
1.0.0.b7
1.0.0.b8
1.0.0.b9

现在我需要在我期望底部的最高版本号的地方对它进行排序,如下所示:

1.0.0.b1
1.0.0.b2
1.0.0.b3
1.0.0.b4
1.0.0.b5
1.0.0.b6
1.0.0.b7
1.0.0.b8
1.0.0.b9
1.0.0.b10
1.0.0.b11
1.0.0.b12
1.0.0.b13
1.0.0.b14
1.0.0.b15
1.0.0.b16
1.0.0.b17
1.0.0.b18
1.0.0.b19
1.0.0.b20
1.0.0.b21
1.0.0.b22

现在在带有 GNU sort 的 linux 中很容易 - 只需使用 sort -V

但这也必须在我没有任何经验的 macOS 上工作,但通过测试我知道 -V 在那里不起作用。

我试过了

sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n

但那里没有运气。

我想让它按版本/内部版本号排序,例如

1.1.3.b5 高于 1.0.3.b66

我在这里错过了什么?你能帮我么?此外,不幸的是,安装 homebrew coreutils 不是一种选择

谢谢你,亚历克斯兄弟

标签: bashmacosgnu

解决方案


我假设您真正的完整列表不会包含所有b版本。您需要将字段 4 拆分为两个键;一个用于字母部分,一个用于数字部分。

$: sort -t. -k1n -k2n -k3n -k4.1,4.1 -k4.2n vnums
1.0.0.a5
1.0.0.a10
1.0.0.a13
1.0.0.a19
1.0.0.b1
1.0.0.b6
1.0.0.b8
1.0.0.b9
1.0.0.b12
1.0.0.b14
1.0.0.b17
1.0.0.b20
1.0.0.b21
1.0.0.b22
1.0.0.c3
1.0.0.c7
1.0.0.c15
1.0.0.c16
1.0.0.d2
1.0.0.d4
1.0.0.d11
1.0.0.d18
1.0.3.b66
1.1.3.b5

请注意字段 4 的 alpha 列限制为单个字符。


推荐阅读