web-dev-qa-db-ja.com

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
18
Mandragor

GNUソートには_-V_があり、そのようなリストをほとんど処理できます( details ):

_ -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 (GNU coreutils) 8.23)、少なくとも私のシステムのsortでサポートされています。

20
ilkkachu

チェックアウト sort -V

   -V, --version-sort
          natural sort of (version) numbers within text

バージョン番号は複雑な野獣であり、アルファベット部分を管理する標準はほとんどありませんが、実際のデータでこれを試して、それで十分かどうかを確認してください。

7
rosuav

これは1行で実行できますが、ここでは読みやすくするために(パイプで)複数の行に分割し、rcも処理します。

並べ替えに-Vオプションがない場合、またはある場合でも、時々発生するrcに対処する必要があります。

cat versionlist |
sed -e "s/release-//" -e "s/rc//" |
sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 |
sed -r -e "s/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)/\1.\2.\3.rc\4/" -e "s/^/release-/"

最初のsedは数字以外の文字を取り除きます
sort.区切り文字(-t.)、数値ソート(-n)、およびキー(-k)を使用します
最後のsedは、数値以外の文字を元の場所に戻します。

3
MikeD
$ cat /tmp/tmp.tmp
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

$ cat /tmp/tmp.tmp | awk -F\- '{ print $2,$1 }' | sort -n | awk '{ print $2 "-" $1 }'
release-5.0.0
release-5.0.0.rc1
release-5.0.0.rc2
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

$
0
boardrider

すべてのインスピレーションをありがとう-私は自分の答えを提案できますか:ソートプログラムはだまされて必要なことを行うことができます。最後に、3桁のバージョン番号に4番目の番号を追加し、並べ替えて、もう一度削除します。機能-これまでのところ最も単純な解決策、IMHO。

cat versionlist |\
sed -r "s/([0-9]+\.[0-9]+\.[0-9]+$)/\1\.99999/"|sort -V|sed s/\.99999$//

結果:

release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0

....
0
Mandragor