Saya harus mengurutkan daftar berikut dengan skrip shell dan membuat versi terbaru muncul di bagian bawah atau atas. Bagaimana saya melakukannya dengan alat shell saja?
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
printf '%s\n' ${(on)array}
dizsh
. (ketika daftar ada dalam$array
array).Jawaban:
Jenis GNU memiliki
-V
yang sebagian besar dapat menangani daftar seperti itu ( perincian ):Namun,
.rc*
versi - versi itu bisa menjadi sedikit masalah, karena mereka mungkin harus diurutkan sebelum versi non-rc yang sesuai, jika kebetulan keduanya, yaitu. Beberapa sistem versi (seperti Debian), menggunakan sufiks yang dimulai dengan tilde (~
) untuk menandai pra-rilis, dan mereka mengurutkan sebelum versi tanpa sufiks, yang mengurutkan versi sebelum dengan sufiks lainnya. Rupanya ini didukung oleh setidaknyasort
pada sistem saya, seperti yang ditunjukkan di atas (sort (GNU coreutils) 8.23
).sumber
-V
juga didukung secara defaultsort
pada OpenBSD, tetapi tidak pada NetBSD.Lihat
sort -V
:Nomor versi adalah binatang yang rumit, dengan sangat sedikit standar yang mengatur bagian-bagian alfabet, tetapi coba ini pada data aktual Anda dan lihat apakah itu cukup.
sumber
mayorNumber–minorNumer some text
, di mana pengurutan bidang gagal karena pembatas unicode. Terima kasih atas petunjuknya!Ini dapat dilakukan sebagai satu baris, tetapi dipecah menjadi beberapa baris (di pipa) di sini untuk dibaca, dan menangani
rc
juga.Jika Anda tidak memiliki
-V
pilihan untuk jenis Anda, atau bahkan jika Anda punya, Anda harus berurusan dengan sesekalirc
:sed
Strip pertama menghilangkan karakter non-numerik.
sort
Menggunakan.
pembatas (-t.
), sortir numerik (-n
), dan kunci (-k
). Final
sed
mengembalikan karakter non-numerik kembali ke tempatnya.sumber
Terima kasih atas semua inspirasi - Boleh saya mengusulkan jawaban saya sendiri: Program semacam ini bisa diakali untuk melakukan apa yang dibutuhkan. Pada akhirnya ini adalah tentang menambahkan angka keempat ke versi 3 digit, mengurutkannya, dan kemudian menghapusnya lagi. Bekerja - solusi paling sederhana sejauh ini, IMHO.
hasil:
sumber
sumber