Shell-Script
如何對具有 major.minor.patch 級別的列表進行排序,有時 rc 正確?
我必須使用 shell 腳本對以下列表進行排序,並使最新版本出現在底部或頂部。我將如何僅使用 shell 工具來做到這一點?
release-5.0.0.rc1 release-5.0.0.rc2 release-5.0.0 release-5.0.1 release-5.0.10 release-5.0.11 release-5.0.13 release-5.0.14 release-5.0.15 release-5.0.16 release-5.0.17 release-5.0.18 release-5.0.19 release-5.0.2 release-5.0.20 release-5.0.21 release-5.0.22 release-5.0.23 release-5.0.24 release-5.0.25 release-5.0.26 release-5.0.27 release-5.0.28 release-5.0.29 release-5.0.3
GNU sort
-V
主要可以處理這樣的列表(詳細資訊):-V, --version-sort natural sort of (version) numbers within text $ cat vers release-5.0.19 release-5.0.19~pre1 release-5.0.19-bigbugfix release-5.0.2 release-5.0.20 $ sort -V vers release-5.0.2 release-5.0.19~pre1 release-5.0.19 release-5.0.19-bigbugfix release-5.0.20
但是,這些
.rc*
版本可能有點問題,因為它們可能應該在相應的非 rc 版本之前排序,如果碰巧兩者都有,那就是。一些版本控制系統(例如 Debian 的)使用以波浪號 ( ) 開頭的後綴~
來標記預發布版本,並且它們在沒有後綴的版本之前排序,在有其他後綴的版本之前排序。顯然,至少sort
在我的系統上支持這一點,如上所示 (sort (GNU coreutils) 8.23
)。要對範例列表進行排序,您可以使用以下命令:
perl -pe 's/\.(?=rc)/~/' < versions.txt | sort -V | perl -pe 's/~/./' > versions-sorted.txt