【问题标题】:How to sort release version string in descending order with Bash如何使用 Bash 按降序对发布版本字符串进行排序
【发布时间】:2020-12-16 00:38:01
【问题描述】:

我有一个发布版本字符串列表,看起来像这样:

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"

【问题讨论】:

    标签: bash sorting sh


    【解决方案1】:

    您实际上可以通过 命令替换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")
    

    【讨论】:

      【解决方案2】:
      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[*]}
      

      这使用sedsort 对项目进行反向排序,使用. 作为字段分隔符,并将每个字段视为数字:

      2.0.1231 1.3.1243 1.2.4124 1.2.3231 0.9.5231 0.8.4454
      

      【讨论】:

        【解决方案3】:
        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")
        

        【讨论】:

          猜你喜欢
          • 2017-03-04
          • 2017-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-21
          • 1970-01-01
          • 2013-06-05
          相关资源
          最近更新 更多