たとえば、文字列をどのようにソートしますか?
"1.3.2 1.3.1 1.2.3 1.1.1.5"
到着
"1.1.1.5 1.2.3 1.3.1 1.3.2"
したがって、バージョンがいくつの数字で構成されているのか、文字列にいくつのバージョンがあるのかはわかりません。
この問題を解決するには?
ありがとう
答え1
これは、変数を引用しないことが役に立つ数少ない場合の1つです。
$ 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
これは、数値をソートするためにGNUソートの-V
別名--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
または配列:
$ 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")
しかし、空白で区切られたさまざまな値を持つ単純な文字列ではなく、配列を使用する必要があることはほぼ確実です。これを行わない唯一の実際の理由は、使用しているシェル(たとえばash
)が配列をサポートしていないためです。
例えば
$ 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")
答え2
そしてperl
:
$ s='1.3.2 1.3.1 1.2.3 1.1.1.5'
$ echo "$s" | perl -Mversion -lane 'print join " ", sort {
version->parse($a) cmp version->parse($b) } @F'
1.1.1.5 1.2.3 1.3.1 1.3.2