como posso classificar uma string como, por exemplo
"1.3.2 1.3.1 1.2.3 1.1.1.5"
para
"1.1.1.5 1.2.3 1.3.1 1.3.2"
Portanto, não sei em quantos números a versão consiste e não sei quantas versões existem na string.
Como resolver isso?
Obrigado
Responder1
Este é um dos poucos casos em que NÃO citar uma variável é útil.
$ 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
-V
Isso usa a opção também conhecida como classificação GNU --version-sort
para classificar os números.
Você pode armazenar isso de volta em uma variável, até mesmo na mesma variável ( $string
):
$ string=$(printf "%s\n" $string | sort -V)
$ echo $string
1.1.1.5 1.2.3 1.3.1 1.3.2
ou uma 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")
Aliás, você quase certamente deveria usar um array em vez de uma string simples com espaços em branco separando vários valores diferentes. A única razão real para não fazer isso é se você estiver usando um shell (como ash
) que não suporta matrizes.
por exemplo
$ 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")
Responder2
Com 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