Bash変数文字列の増加

Bash変数文字列の増加
VERSION="4.0beta12"
NEXT_VERSION=?????

自動リリーススクリプトを作成しながら、現在のバージョンを$ VERSION変数に保存し、次のバージョンを$ NEXT_VERSIONとして計算しようとしています。

ルール:文字列の終わりの整数を増やします。
4.0ベータ12→4.0ベータ13
4.2アルファ9→4.2アルファ10

sed/awk/evalを試しましたが、正しく機能しません。アイデアはありますか?どんなツールでも可能です。

答え1

Bash以外には何も必要ありません。

for version in 12.4alpha9 12.4alpha12 12.4alpha-2; do
    echo -n "$version => ";
    [[ "$version" =~ (.*[^0-9])([0-9]+)$ ]] && version="${BASH_REMATCH[1]}$((${BASH_REMATCH[2]} + 1))";
    echo "$version";
done

あなたと実際に関連する唯一の行は、正規表現チェックを含む行です[[。この行は、最後の数字まで続くすべてを記憶し、それを再利用し、次の数字を追加します。

答え2

常に合理的に整理された規則があると仮定すると(バージョンには常に数字がなく、バージョンは常に数字で終わります)、扱いにくいですが、これが開始かもしれません。

#!/usr/bin/gawk -f
1 {
    pfx = gensub(/^(.*[^0-9])([0-9]+)$/, "\\1", "")
    patchlevel = gensub(/^(.*[^0-9])([0-9]+)$/, "\\2", "")

    new_pl = (1*patchlevel)+1
    printf "%s%s\n", pfx, new_pl
}

テスト:

[0 1066] ~/temp % echo "12.4alpha9" | gawk -f incvers.awk
12.4alpha10
[0 1067] ~/temp % echo "12.4alpha12" | gawk -f incvers.awk
12.4alpha13
[0 1068] ~/temp % echo "12.4alpha-2" | gawk -f incvers.awk
12.4alpha-3

答え3

持ってみよう

MAJOR=4
MINOR=0
STATE="beta"
POINT=9
VERSION=$MAJOR.$MINOR$STATE$POINT
NEXT_VERSION=$MAJOR.$MINOR$STATE$((POINT +1 ))

echo "Next version is $NEXT_VERSION"
# other release stuff here 

これが独自の書き換えスクリプトになりたいですか?次のようなことを提案します。

tempfile=$( tempfile -d . )
sed -re "s/POINT=[0-9]+/POINT=$(( ++POINT ))/" $0 > $tempfile
chmod +x $tempfile
mv $tempfile $0

答え4

これは、末尾の数字に1を加える移植可能なシェルの断片です$current_version

n=${current_version##*[!0-9]}; p=${current_version%%$n}
next_version=$p$((n+1))

単純だからといって(とても簡単だ)良いアイデアという意味ではありません。良いアンドリュー、変数定義をコンポーネントに分割することをお勧めします。

関連情報