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

Kir*_*rby 10 sorting bash 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
Run Code Online (Sandbox Code Playgroud)

以适当的方式.例如,就像version_compare()在PHP中一样(它不直接,但可以用于此).

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

$ echo 1.0 1.0-alpha | tr ' ' "\n" | sort --version-sort
1.0
1.0-alpha
Run Code Online (Sandbox Code Playgroud)

有一些存在的方法吗?

PS

在一般意义上,它应遵循此模式:

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.
Run Code Online (Sandbox Code Playgroud)

PPS

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

Hen*_*ijo 14

您可以使用 Linux 排序:

$ printf "1.0\n2.0\n2.12\n2.10\n1.2\n1.10" | sort -t "." -k1,1n -k2,2n -k3,3n
1.0
1.2
1.10
2.0
2.10
2.12
Run Code Online (Sandbox Code Playgroud)

来源:https : //gist.github.com/loisaidasam/b1e6879f3deb495c22cc#gistcomment-1613531


gle*_*man 8

好吧,我们可以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
Run Code Online (Sandbox Code Playgroud)

下划线词汇排序连字符。那是诀窍。

  • @shadowbq 如果你去掉可选的大括号,它将与 mac `sed` 一起使用:`sed '/-/!s/$/_/'` (为了便于阅读,我添加了一个空格。) (3认同)
  • 这在 macos 下可能会失败,你应该使用 gsed (2认同)

Kir*_*rby 3

1.bash中的自定义脚本

我实施了自己的解决方案

代码有点难看,但是可以用。

安装

$ curl -Ls https://gist.github.com/andkirby/0046df5cad44f86b670a102b7c8b7ba7/raw/version_sort_install.sh | bash
Semantic version sort: /usr/bin/semversort

$ semversort 1.0 1.0-rc 1.0-patch 1.0-alpha
1.0-alpha
1.0-rc
1.0
1.0-patch
Run Code Online (Sandbox Code Playgroud)

2.在node中使用semver

注意:所有版本必须遵循特定架构,并且不支持“补丁”。

https://github.com/npm/node-semver/blob/master/README.md

$ npm install --global semver
C:\Users\u.user\.node\semver -> C:\Users\u.user\.node\node_modules\semver\bin\semver
semver@5.3.0 C:\Users\u.user\.node\node_modules\semver

$ ~/.node/semver 1.2.3 1.3.6-patch 1.3.6-beta 1.3.6 1.3.6-alpha 1.0.4
1.0.4
1.2.3
1.3.6-alpha
1.3.6-beta
1.3.6-patch
1.3.6
Run Code Online (Sandbox Code Playgroud)

3. 在控制台中使用 PHP 和 version_compare()

另外,这里是PHP 本机version_compare()(当然使用 PHP:))。