変数(XYZ)にセマンティクスバージョン文字列があります。 2番目の点が消え、Zに数字が1つしかない場合は、YとZをゼロで区切って接続するか、Zに数字が2つある場合は直接接続するように変更する必要があります。
デフォルトでは、次のように進みます。
1.5.0 -> 1.500
1.5.1 -> 1.501
1.4.7 -> 1.407
1.4.10 -> 1.410
1.4.24 -> 1.424
Bashを使ってこれを行うにはどうすればよいですか?
答え1
を含むすべてのPOSIXシェルとksh演算子をbash
使用します。${var##pattern}
${var%pattern}
case $string in
(*.*.*)
minor=${string##*.}
case $minor in
(? | "") minor=0$minor
esac
string=${string%.*}$minor
esac
特に、bash-3.2+(およびbash 3.1互換性が有効になっていない場合)の場合は、次のこともできます。
if [[ $string =~ ^(.*\..*)\.([^.]*)([^.])$ ]]; then
string=${BASH_REMATCH[1]}${BASH_REMATCH[2]:-0}${BASH_REMATCH[3]}
fi
答え2
パラメータ拡張を使用します。
#!/bin/bash
declare -A expect=(
[1.5.0]=1.500
[1.5.1]=1.501
[1.4.7]=1.407
[1.4.10]=1.410
[1.4.24]=1.424
)
new_version() {
prefix=${1%%.*}
suffix=${1##*.}
middle=${1#*.}
middle=${middle%.*}
printf %s.%s%02d "$prefix" "$middle" "$suffix"
}
for old in "${!expect[@]}" ; do
new=$(new_version $old)
if [[ ${expect[$old]} == $new ]] ; then
echo ok
else
echo not ok: in: $old expect: ${expect[$old]} got: $new
fi
done
答え3
Bashでは、read
分割とprintf
ゼロパディングを使用してください。変数を介したold
入出力new
(一部の一時変数使用コスト):
old=1.4.24
IFS=. read -r a b c <<< "$old"
printf -v new "%s.%s%02d" "$a" "$b" "$c"
echo "$old -> $new"
それを印刷する必要があります1.4.24 -> 1.424
答え4
短いawk
解決策:
テストケース:
ver_num="1.4.10"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.410
ver_num="1.5.0"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.500
ver_num="1.4.77"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.477