web-dev-qa-db-ja.com

bashでビルド番号を増やす

コマンドラインを使用してビルド番号を1ずつ増やしようとしています。

これが私のテストファイルの内容です:

SOME_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 4;
SOME_SECOND_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 4;

私が取得したい結果は次のとおりです:

SOME_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 5;
SOME_SECOND_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 5;

私は次のようなものを使用しようとしています:

sed -i -E "s/CURRENT_PROJECT_VERSION = (\d+);/CURRENT_PROJECT_VERSION = \1~;/" test.txt

私はbashスクリプトの経験がなく、数値を1ずつ増やす方法がわかりません。 (MacOSを使用していますが、sedコマンドはLinuxとほぼ同じです)

5
awk -F '= ' '/CURRENT_PROJECT_VERSION/{$2=$2+1";"}1' OFS='= ' input > output

テスト

cat file
SOME_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 4;
SOME_SECOND_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 4;

awk -F '= ' '/CURRENT_PROJECT_VERSION/{$2=$2+1";"}1' OFS='= ' file
SOME_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 5;
SOME_SECOND_DUMMY_VALUE = -1;
CURRENT_PROJECT_VERSION = 5;
7
Paulo Tomé

もう1つの答えは、awkのみを使用することです。これは、全体を通してkey <space> = <space> value;構文に従うことを前提としています。

awk '$1 == "CURRENT_PROJECT_VERSION" {$3=($3+1)";"}1' testfile.txt

これにより、CURRENT_PROJECT_NUMBERで始まるすべての行で3番目のフィールドが1増加しますが、それ以外の場合はすべての行が「そのまま」印刷されます(これは、コードブロックの後ろの1の意味です)。

「何かをインクリメントするstarting with a number」構文が移植可能かどうかはわからないので、念のため(そして少しだけ長く)、インクリメントする前にフィールド3から末尾のセミコロンを削除できます。 :

awk '$1 == "CURRENT_PROJECT_VERSION" {sub(";","",$3); $3=($3+1)";"}1' testfile.txt
3
AdminBee

Sedとbashの場合:

FILE="test.txt"
REGEX="\(CURRENT_PROJECT_VERSION *= *\)\([0-9]\+\);"

version=$(sed -ne "s/${REGEX}/\2/p" ${FILE} | head -1)
((version++))

sed -ie "s/${REGEX}/\1${version};/" ${FILE}
2
ckarles

Perlを使用して、ファイルをインプレースで変更します。

Perl -pi -e 's/\bCURRENT_PROJECT_VERSION\s*=\s*\K-?\d+/$& + 1/ge' test.txt
2