wie kann ich einen String sortieren wie zum Beispiel
"1.3.2 1.3.1 1.2.3 1.1.1.5"
Zu
"1.1.1.5 1.2.3 1.3.1 1.3.2"
Ich weiß also nicht, aus wie vielen Zahlen die Version besteht und ich weiß nicht, wie viele Versionen der String enthält.
Wie kann man das lösen?
Danke
Antwort1
Dies ist einer der wenigen Fälle, in denen es sinnvoll ist, eine Variable NICHT in Anführungszeichen zu setzen.
$ 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
Hierbei wird die aka- Option von GNU sort --version-sort
zum Sortieren der Zahlen verwendet.
Sie können dies wieder in einer Variablen speichern, sogar in derselben Variable ( $string
):
$ string=$(printf "%s\n" $string | sort -V)
$ echo $string
1.1.1.5 1.2.3 1.3.1 1.3.2
oder ein Array:
$ 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")
Übrigens sollten Sie mit ziemlicher Sicherheit ein Array verwenden und nicht einen einfachen String mit Leerzeichen zwischen mehreren unterschiedlichen Werten. Der einzige wirkliche Grund, dies nicht zu tun, ist, wenn Sie eine Shell (wie ash
) verwenden, die keine Arrays unterstützt.
z.B
$ 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")
Antwort2
Mit 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