在bash上sorting版本string

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 

是否有可能只用bashsorting所有这些版本string,最新的是在顶部?

这是可能的,但是工作量很少。 如果你有GNU排序:

 sort -V -r <STRINGS.txt 

…会做你正在要求的。


现在,如果你的意思是没有外部工具,那么你遇到了一些麻烦。 Freenode的#bash IRC频道上的BlastHardcheese已经在本机bash中编写了下面的快速排序算法,为了便于阅读,我们对其进行了修改,将compare功能分解为可重复使用,并使用Bash 4.3 namevars来处理可配置的变量名字(当然,后面这个变化意味着需要一个非常新的bash版本):

 # this needs to be replaced for this particular case compare(){ (( $1 >= $2 )) } swap(){ declare -na=$1 local t t=${a[$2]} a[$2]=${a[$3]} a[$3]=$t } partition(){ declare -na=$1 local cpx p=${a[$4]} c=$2 swap "$1" "$3" "$4" for((x=$2;x<$3;x++)); do if ! compare "${a[x]}" "$p"; then swap "$1" "$x" "$c" ((c++)) fi done swap "$1" "$2" "$c" n=$c } quicksort(){ declare -na=$1 (( "$2" >= "$3" )) && return local in 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 <<<"$1" IFS=. read -r -a second <<<"$2" 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 <STRINGS.txt quicksort versions 0 "$(( ${#versions[@]} - 1 ))" printf '%s\n' "${versions[@]}" 

我知道你不需要Python解决方案,但对于那些缺乏GNU sort (如OS X)的人来说,这确实是一个简单的方法。

鉴于:

 $ echo "$a" 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 

Python 1班轮:

 $ echo "$a" | python -c ' import sys, re; print "".join(sorted(sys.stdin.readlines(), key=lambda s: map(int, re.findall("\\d+", s)), reverse=True))' 3.0.16 3.0.15.1 3.0.15 3.0.14 3.0.13.1 3.0.13 3.0.12 3.0.11.2 3.0.11.1 3.0.11 3.0.10.3 3.0.10.2 3.0.10.1 3.0.10 3.0.9.2 3.0.9.1 3.0.9 3.0.8.1 3.0.8 3.0.7.2 3.0.7.1 3.0.7 3.0.6.1 3.0.6 3.0.5 3.0.3 3.0.2 3.0.1 3.0.0