¿Cómo puedo ordenar una cadena como, por ejemplo?
"1.3.2 1.3.1 1.2.3 1.1.1.5"
a
"1.1.1.5 1.2.3 1.3.1 1.3.2"
Entonces no sé de cuántos números consta la versión y no sé cuántas versiones hay en la cadena.
¿Cómo solucionar esto?
Gracias
Respuesta1
Este es uno de los pocos casos en los que NO es útil citar una variable.
$ string="1.3.2 1.3.1 1.2.3 1.1.1.5"
$ printf "%s\n" $string | sort -V
1.1.1.5
1.2.3
1.3.1
1.3.2
Esto utiliza la opción -V
también conocida como GNU sort --version-sort
para ordenar los números.
Puedes volver a almacenarlo en una variable, incluso en la misma variable ( $string
):
$ string=$(printf "%s\n" $string | sort -V)
$ echo $string
1.1.1.5 1.2.3 1.3.1 1.3.2
o una matriz:
$ array=( $(printf "%s\n" $string | sort -V) )
$ typeset -p array
declare -a array=([0]="1.1.1.5" [1]="1.2.3" [2]="1.3.1" [3]="1.3.2")
Por cierto, es casi seguro que debería utilizar una matriz en lugar de una cadena simple con espacios en blanco que separen varios valores diferentes. La única razón real para no hacerlo es si estás usando un shell (como ash
) que no admite matrices.
p.ej
$ array=( 1.3.2 1.3.1 1.2.3 1.1.1.5 )
$ typeset -p array
declare -a array=([0]="1.3.2" [1]="1.3.1" [2]="1.2.3" [3]="1.1.1.5")
$ array=( $(printf "%s\n" "${array[@]}" | sort -V) )
$ typeset -p array
declare -a array=([0]="1.1.1.5" [1]="1.2.3" [2]="1.3.1" [3]="1.3.2")
Respuesta2
Con perl
:
$ s='1.3.2 1.3.1 1.2.3 1.1.1.5'
$ echo "$s" | perl -Mversion -lane 'print join " ", sort {
version->parse($a) cmp version->parse($b) } @F'
1.1.1.5 1.2.3 1.3.1 1.3.2