Bash:使用awk等对由空格分隔的字符串中的版本号进行排序

von*_*otz 1 bash sort

例如,我如何对字符串进行排序

 "1.3.2 1.3.1 1.2.3 1.1.1.5"
Run Code Online (Sandbox Code Playgroud)

"1.1.1.5 1.2.3 1.3.1 1.3.2"
Run Code Online (Sandbox Code Playgroud)

所以我不知道版本包含多少个数字,也不知道字符串中有多少个版本。

如何解决这个问题?

谢谢

cas*_*cas 6

这是不引用变量有用的少数情况之一。

$ 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
Run Code Online (Sandbox Code Playgroud)

这使用 GNU sort 的-Vaka--version-sort选项来对数字进行排序。

您可以将其存储回变量,甚至是同一个变量 ( $string):

$ string=$(printf "%s\n" $string | sort -V)
$ echo $string 
1.1.1.5 1.2.3 1.3.1 1.3.2
Run Code Online (Sandbox Code Playgroud)

或数组:

$ 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")
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您几乎肯定应该使用数组,而不是使用空格分隔多个不同值的简单字符串。不这样做的唯一真正原因是,如果您使用的ash是不支持数组的 shell(如)。

例如

$ 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")
Run Code Online (Sandbox Code Playgroud)