Tengo que ordenar la siguiente lista con un script de shell y hacer que la última versión aparezca en la parte inferior o superior. ¿Cómo haría eso solo con herramientas de shell?
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}
enzsh
. (cuando la lista está en la$array
matriz).Respuestas:
GNU sort tiene
-V
que en su mayoría puede lidiar con una lista como esa ( detalles ):Sin embargo, esas
.rc*
versiones podrían ser un poco problemático, ya que probablemente deberían clasificarse antes de la versión no rc correspondiente, si es que hay ambas, es decir. Algunos sistemas de versiones (como Debian), usan sufijos que comienzan con tilde (~
) para marcar versiones preliminares, y se ordenan antes de la versión sin sufijo, que se clasifica antes que las versiones con otros sufijos. Aparentemente, esto es compatible al menossort
en mi sistema, como se muestra arriba (sort (GNU coreutils) 8.23
).fuente
-V
también soportado por defectosort
en OpenBSD, pero no en NetBSD.Echa un vistazo a
sort -V
:Los números de versión son bestias complicadas, con muy pocos estándares que rigen las porciones alfabéticas, pero intente esto en sus datos reales y vea si es suficiente.
fuente
mayorNumber–minorNumer some text
, donde la clasificación de campos falla debido al delimitador Unicode. ¡Gracias por la pista!Esto se puede hacer como una línea, pero dividir en varias líneas (en las tuberías) aquí para facilitar la lectura, y también maneja las
rc
's.Si no tiene una
-V
opción para su tipo, o incluso si la tiene, tendrá que lidiar con los ocasionalesrc
:El primero
sed
elimina los caracteres no numéricos.El
sort
utiliza un.
delimitador (-t.
), ordenación numérica (-n
) y teclas (-k
).El último
sed
vuelve a colocar los caracteres no numéricos.fuente
Gracias por toda la inspiración. ¿Puedo proponer mi propia respuesta? Se puede engañar al programa de clasificación para que haga lo que se necesita. Al final, se trata de agregar un cuarto número a la versión de 3 dígitos, ordenarlo y luego eliminarlo nuevamente. Funciona: la solución más simple hasta ahora, en mi humilde opinión.
resultado:
fuente
fuente