次のリストをシェルスクリプトで並べ替え、最新バージョンを下部または上部に表示する必要があります。シェルツールだけでどうすればよいですか?
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ソートには_-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
でサポートされています。
チェックアウト sort -V
:
-V, --version-sort
natural sort of (version) numbers within text
バージョン番号は複雑な野獣であり、アルファベット部分を管理する標準はほとんどありませんが、実際のデータでこれを試して、それで十分かどうかを確認してください。
これは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
は、数値以外の文字を元の場所に戻します。
$ 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
$
すべてのインスピレーションをありがとう-私は自分の答えを提案できますか:ソートプログラムはだまされて必要なことを行うことができます。最後に、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
....