Shell-Script

如何對具有 major.minor.patch 級別的列表進行排序,有時 rc 正確?

  • January 21, 2022

我必須使用 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

引用自:https://unix.stackexchange.com/questions/350315