bash - 如何在 bash 中对语义版本进行排序?

标签 bash sorting version semantic-versioning

我想对语义版本(semver.org)进行排序

v1.4.0
v1.4.0-alpha
v1.4.0-alpha1
v1.4.0-patch
v1.4.0-patch9
v1.4.0-patch10
v1.4.0-patch2
v1.5.0
v1.5.0-alpha
v1.5.0-alpha1
v1.5.0-alpha2
v1.5.0-patch
v1.5.0-patch1

以适当的方式。例如,作为 version_compare() does in PHP (它不是直接的,但可以用于此)。

当然,sort -V|--version-sort 在这里不起作用。

$ echo 1.0 1.0-alpha | tr ' ' "\n" | sort --version-sort
1.0
1.0-alpha

有没有现成的方法?

附言

按常理来说,它应该遵循这个模式:

1.0.0-alpha 
  < 1.0.0-alpha.1 
    < 1.0.0-alpha.beta 
      < 1.0.0-beta
        < 1.0.0-beta.2
          < 1.0.0-beta.11
           < 1.0.0-rc.1 < 1.0.0
             < 1.0.0-patch < 1.0.0-patch.1.

P.P.S.

Semver 2.0 不支持补丁,但它是必需的。

最佳答案

好吧,我们可以通过在字符串末尾为不包含连字符的行添加一个虚拟字符来欺骗 sort -V:

$ echo "$versions" | sed '/-/!{s/$/_/}' | sort -V | sed 's/_$//'
v1.4.0-alpha
v1.4.0-alpha1
v1.4.0-patch
v1.4.0-patch2
v1.4.0-patch9
v1.4.0-patch10
v1.4.0
v1.5.0-alpha
v1.5.0-alpha1
v1.5.0-alpha2
v1.5.0-patch
v1.5.0-patch1
v1.5.0

下划线在词法上对 连字符进行排序。这就是诀窍。


处理补丁可以使用相同的策略:用下划线替换连字符,并在排序后恢复

cat << VERSIONS | sed '/-/!{s/$/_/;}; s/-patch/_patch/' | sort -V | sed 's/_$//; s/_patch/-patch/'
v1.4.0-alpha
v1.4.0-alpha1
v1.4.0-beta
v1.4.0-patch
v1.4.0-patch2
v1.4.0-patch9
v1.4.0-patch10
v1.4.0-rc1
v1.4.0
v1.5.0-alpha
v1.5.0-alpha2
v1.5.0-alpha1
v1.5.0-beta
v1.5.0-patch
v1.5.0-patch1
v1.5.0-beta2
v1.5.0
VERSIONS

输出

v1.4.0-alpha
v1.4.0-alpha1
v1.4.0-beta
v1.4.0-rc1
v1.4.0
v1.4.0-patch
v1.4.0-patch2
v1.4.0-patch9
v1.4.0-patch10
v1.5.0-alpha
v1.5.0-alpha1
v1.5.0-alpha2
v1.5.0-beta
v1.5.0-beta2
v1.5.0
v1.5.0-patch
v1.5.0-patch1

关于bash - 如何在 bash 中对语义版本进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390957/

相关文章:

android - 是否可以将 google 销售的 Android Dev Phone 2 更新到 2.1 操作系统?

android - 如何在 Android 中查找我的 Google map 版本

objective-c - NSTask 没有从用户环境中获取 $PATH

linux - 将值从 bash for 循环转换为 json 对象

java - Collections.sort - IllegalArgumentException : Comparison method violates its general contract

java - 时髦的冒泡排序 (Java Eclipse)

linux - bash 根据年龄删除子目录但保留最后一个 X

bash - unix 中的自定义脚本输出

java - 如何对字母数字字符串进行排序并更改顺序?

java - 比较版本(字符串)