web-dev-qa-db-ja.com

bash変数文字列の番号を増分

VERSION="4.0beta12"
NEXT_VERSION=?????

自動リリーススクリプトを作成すると、変数$ VERSIONに現在のバージョンがあり、次のバージョンを$ NEXT_VERSIONとして計算したいと思います。

規則:文字列の最後にある整数を増やします。
4.0beta12→4.0beta13
4.2alpha9→4.2alpha10

Sed/awk/evalで試しましたが、動作しません。アイデア?どのツールでも問題ありません。

5
Nicolas Raoul

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

あなたに本当に関係のある唯一の行は、正規表現チェックが付いている行です[[:最終的な番号に至るまでのすべてを記憶し、それを再利用して次の番号を追加します。

7
janmoesen

あなたが常にいくつかの適切な整形式のルールを持っていると仮定すると(常にバージョンでは数字ではなく、バージョンは常に数字で終わります)、これはklunkyではありますが、開始かもしれません:

#!/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
5
Ulrich Schwarz

持ってみてください

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
3
Andrew

これは、$current_versionの末尾の数字に1を追加するポータブルシェルスニペットです。

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

単純な(まあ、かなり単純な)からといって、それが良いアイデアであるとは限りません。 Andrew のように、変数の定義をコンポーネントに分解することをお勧めします。