linux里面字符串排序,linux – 在bash上对版本字符串进行排序

本文介绍了一种使用Bash脚本对版本号字符串进行排序的方法。通过自定义快速排序算法和版本比较函数,实现了对类似“3.0.33.0.11.2”这样的版本号列表进行正确排序的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STRINGS.txt的示例内容:

3.0.3

3.0.11.2

3.0.11.1

3.0.11

3.0.16

3.0.15.1

3.0.15

3.0.14

3.0.10.3

3.0.10.2

3.0.10.1

3.0.13.1

3.0.10

3.0.13

3.0.9

3.0.12

3.0.8

3.0.7.2

3.0.7.1

3.0.7

3.0.9.2

3.0.9.1

3.0.2

3.0.8.1

3.0.6.1

3.0.6

3.0.5

3.0.1

3.0.0

是否可以仅使用bash对所有这些版本字符串进行排序,最新版本是否在顶部?

解决方法:

这是可能的,但却是一项愚蠢的工作.如果你有GNU排序:

sort -V -r

……将完全按照你的要求行事.

现在,如果你的意思是没有外部工具,那么你就会陷入困境. Freenode的#bash IRC频道上的BlastHardcheese已经在本机bash中编写了以下quicksort算法,我为了便于阅读而修改了该算法,将比较函数分解为可重放,并使用Bash 4.3 namevars来处理可配置变量name(当然,后一个更改意味着需要一个非常新版本的bash):

# this needs to be replaced for this particular case

compare(){

(( $1 >= $2 ))

}

swap(){

declare -n a=$1

local t

t=${a[$2]}

a[$2]=${a[$3]}

a[$3]=$t

}

partition(){

declare -n a=$1

local c p x

p=${a[$4]}

c=$2

swap "$1" "$3" "$4"

for((x=$2;x

if ! compare "${a[x]}" "$p"; then

swap "$1" "$x" "$c"

((c++))

fi

done

swap "$1" "$2" "$c"

n=$c

}

quicksort(){

declare -n a=$1

(( "$2" >= "$3" )) && return

local i n

i=$((($2+$3)/2))

partition "$1" "$2" "$3" "$i"

quicksort "$1" "$2" "$((n-1))"

quicksort "$1" "$((n+1))" "$3"

}

…实现自己的比较功能,然后可以采用.

仅处理您在此处显示的案例:

# we want to return 0 if the first version is equal or later than the second

version_compare(){

local -a first second

# Let's start with trivial cases:

if [[ $1 = "$2" ]] || [[ $1 = "$2".* ]]; then : "$1 >= $2"; return 0; fi

IFS=. read -r -a first <<

IFS=. read -r -a second <<

local k

for k in "${!first[@]}"; do

local a=${first[$k]} b=${second[$k]}

: "Evaluating field $k ($a vs $b)"

if [[ ! $b ]]; then

# ie. first=1.1.1, second=1.1; though this should have been handled above

: "$1 >= $2"; return 0;

fi

if (( $b > $a )); then

: "$1 < $2"; return 1;

fi

done

: "$1 >= $2"; return 0;

}

compare() {

version_compare "$2" "$1" # reverse sort order

}

要执行文件IO,假设bash 4:

readarray -t versions

quicksort versions 0 "$(( ${#versions[@]} - 1 ))"

printf '%s\n' "${versions[@]}"

标签:bash,linux,shell

来源: https://codeday.me/bug/20191002/1845007.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值