[英]How to sort semantic versions in bash?
我想對語義版本進行排序 ( 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()
在 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.
繳費靈
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
下划線在連字符后按詞法排序。 這就是訣竅。
您可以使用 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
來源: https : //gist.github.com/loisaidasam/b1e6879f3deb495c22cc#gistcomment-1613531
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
注意:所有版本都必須遵循特定的架構,並且它不支持“補丁”。
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
3. 在控制台中使用 PHP 和 version_compare()
此外,PHP本地version_compare()
使用PHP當然:)) 在這里。
curl -s https://api.github.com/repos/glpi-project/glpi/releases | jq --raw-output '.[] | .tag_name' | sed '/-/!{s/$/_/}' | sort -V | sed 's/_$//'
這不正確顯示版本。
如果您使用的是 gplv2 (native osx) 工具,@Glenn Jack 的答案將不起作用,除非使用 gsed。
這個原生 awk 命令可以替代。
| awk '{ if ($1 ~ /-/) print; else print $0"_" ; }' |sort -rV | sed 's/_$//'
| sed -e 's/["\,\s]//g' \ # remove bad symbols: 1.2.3 1.2.3-123 1.2.3-patch
| sed '/-/! s/$/@999/' \ # replace releases: 1.2.3@999 1.2.3-123 1.2.3-patch
| sed 's/[\-\.]/@/g' \ # replaces separators: 1@2@3@999 1@2@3@123 1@2@3@patch
| sed 's/@patch/@9999@/' \ # replace patches: 1@2@3@999 1@2@3@123 1@2@3@9999
| sort -n -t @ -k1 -k2 -k3 -k4 \ # sort by numbers
| sed 's/@9999@/@patch/' \ # replace back 1@2@3@999 1@2@3@123 1@2@3@patch
| sed 's/@999//' \ # replace back 1@2@3 1@2@3@123 1@2@3@patch
| sed 's/@/./' \ # replace back 1.2@3 1.2@3@123 1.2@3@patch
| sed 's/@/./' \ # replace back 1.2.3 1.2.3@123 1.2.3@patch
| sed 's/@/-/' # replace back 1.2.3 1.2.3-123 1.2.3-patch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.