Major.minor.patchレベルと時にはrcレベルでリストを正しくソートする方法は?

Major.minor.patchレベルと時にはrcレベルでリストを正しくソートする方法は?

次のリストを並べ替え、最新バージョンが一番下または一番上に表示されるようにするには、シェルスクリプトを使用する必要があります。シェルツールのみを使用してこれを行うにはどうすればよいですか?

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

ベストアンサー1

GNUソートは-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

おすすめ記事