如何使用 Bash 按降序对发布版本字符串进行排序
How to sort release version string in descending order with Bash
我有一个发布版本字符串列表,看起来像这样:
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )
如何使用 bash 对 releases
数组进行排序,使数组按降序排序(因此左侧的值具有最高优先级)。
所以排序后,上面的例子将按以下顺序排列:
"2.0.1231", "1.3.1243", "1.2.4124", "1.2.3231", "0.9.5231", "0.8.4454"
实际上,您可以使用 命令替换 和 sort
的版本排序选项轻松完成此操作,例如
releases=($(printf "%s\n" "${releases[@]}" | sort -rV))
(注意: printf-trick 只是将元素分隔在不同的行上,这样它们就可以通过管道传输到 sort
用于排序。printf "%s\n"
,尽管只有一个 "%s"
转换说明符,将处理所有输入)
现在 releases
包含:
releases=("2.0.1231" "1.3.1243" "1.2.4124" "1.2.3231" "0.9.5231" "0.8.4454")
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )
sorted=( $(echo ${releases[*]} | sed 's/ /\n/g' | sort -t. -k1,1rn -k2,2rn -k3,3rn) )
echo ${sorted[*]}
这使用 sed
和 sort
对项目进行反向排序,使用 .
作为字段分隔符,并将每个字段视为数字:
2.0.1231 1.3.1243 1.2.4124 1.2.3231 0.9.5231 0.8.4454
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231"
readarray -t sorted < <(printf '%s\n' "${releases[@]}" | sort -Vr)
declare -p sorted
declare -a sorted=([0]="2.0.1231" [1]="1.3.1243" [2]="1.2.4124" [3]="1.2.3231" [4]="0.9.5231" [5]="0.8.4454")
我有一个发布版本字符串列表,看起来像这样:
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )
如何使用 bash 对 releases
数组进行排序,使数组按降序排序(因此左侧的值具有最高优先级)。
所以排序后,上面的例子将按以下顺序排列:
"2.0.1231", "1.3.1243", "1.2.4124", "1.2.3231", "0.9.5231", "0.8.4454"
实际上,您可以使用 命令替换 和 sort
的版本排序选项轻松完成此操作,例如
releases=($(printf "%s\n" "${releases[@]}" | sort -rV))
(注意: printf-trick 只是将元素分隔在不同的行上,这样它们就可以通过管道传输到 sort
用于排序。printf "%s\n"
,尽管只有一个 "%s"
转换说明符,将处理所有输入)
现在 releases
包含:
releases=("2.0.1231" "1.3.1243" "1.2.4124" "1.2.3231" "0.9.5231" "0.8.4454")
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )
sorted=( $(echo ${releases[*]} | sed 's/ /\n/g' | sort -t. -k1,1rn -k2,2rn -k3,3rn) )
echo ${sorted[*]}
这使用 sed
和 sort
对项目进行反向排序,使用 .
作为字段分隔符,并将每个字段视为数字:
2.0.1231 1.3.1243 1.2.4124 1.2.3231 0.9.5231 0.8.4454
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231"
readarray -t sorted < <(printf '%s\n' "${releases[@]}" | sort -Vr)
declare -p sorted
declare -a sorted=([0]="2.0.1231" [1]="1.3.1243" [2]="1.2.4124" [3]="1.2.3231" [4]="0.9.5231" [5]="0.8.4454")