Bir listeyi major.minor.patch düzeyine ve bazen de rc'ye göre nasıl sıralayabilirim?


18

Bir kabuk komut dosyası ile aşağıdaki listeyi sıralamak ve en son sürümü alt veya üst görünür yapmak zorunda. Bunu sadece kabuk araçlarıyla nasıl yapabilirim?

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
Ayrıca bakınız printf '%s\n' ${(on)array}de zsh. (liste $arraydizide olduğunda).
Stéphane Chazelas

Yanıtlar:


20

GNU sıralaması -Vçoğunlukla böyle bir listeyle ilgilenebilir ( ayrıntılar ):

 -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

Ancak, bu .rc*sürümler biraz sorun olabilir, çünkü muhtemelen her ikisi de varsa, karşılık gelen rc olmayan sürümden önce sıralanmalıdır . Bazı sürümleme sistemleri (Debian'ınki gibi), ~ön sürümleri işaretlemek için tilde ( ) ile başlayan sonekleri kullanır ve sonekleri diğer soneklere sahip sürümlerden önce sıralayan bir sonek olmadan sıralarlar. Görünüşe göre bu, sortyukarıda gösterildiği gibi en azından sistemimde destekleniyor ( sort (GNU coreutils) 8.23).


3
Sana birkaç saniye tarafından sniped :)
rosuav

1
Çok teşekkürler. Sıralamanın böyle bir seçeneği olacağını düşünmemiştim bile.
Mandragor

FWIW, OpenBSD'de -Vvarsayılan sortolarak desteklenir , ancak NetBSD'de desteklenmez .
Kusalananda

FreeBSD de, görünüşe göre , oradaki man sayfasında da örnek bir çıktı sırası var ve OpenBSD ile aynı görünüyor.
ilkkachu

7

Çıkış sort -V:

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

Sürüm numaraları, alfabetik bölümleri yöneten çok az standartla karmaşık hayvanlardır, ancak bunu gerçek verilerinizde deneyin ve yeterli olup olmadığını görün.


Vay harika! Bu mayorNumber–minorNumer some text, unicode sınırlayıcı nedeniyle alan sıralamasının başarısız olduğu dosya adları ile eski bir sorunum için bile çalışır . İpucu için teşekkürler!
Philippos

3

Bu bir satır olarak yapılabilir, ancak okunabilirlik için burada birden fazla satıra (borularda) bölünür ve rc'leri de işler .

-VSıralamanız için bir seçeneğiniz yoksa veya yapsanız bile, ara sıra olanlarla uğraşmanız gerekir 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-/"

İlk sedşeritler sayısal olmayan karakterleri kullanır bir sınırlayıcı ( ), sayısal sıralama (- ) ve anahtarlar ( ) nihai sayısal olmayan karakterler yerine geri koyar.
sort.-t.n-k
sed


0

Tüm ilham için teşekkürler - Kendi cevabımı önerebilir miyim: Sıralama programı, gerekli olanı yapmak için kandırılabilir. Sonunda, 3 basamaklı sürümlemeye dördüncü bir sayı eklemek, sıralamak ve sonra tekrar kaldırmakla ilgilidir. İşler - şimdiye kadarki en basit çözüm, IMHO.

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

sonuç:

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

....

0
$ 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

$

release-5.0.0 listede .rc1 ve .rc2 SONRASI gelmelidir. buradaki zorluk budur.
Mandragor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.