Bash: Versionsnummern in einem String durch Leerzeichen getrennt mit awk etc. sortieren

Bash: Versionsnummern in einem String durch Leerzeichen getrennt mit awk etc. sortieren

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

-VHierbei wird die aka- Option von GNU sort --version-sortzum 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

verwandte Informationen