sed コマンドは正規表現を使用して主要なマイナーバージョン番号を置き換えます。

sed コマンドは正規表現を使用して主要なマイナーバージョン番号を置き換えます。

バージョンの週、負、リリース番号を置き換えるためにSedを使用しています。

私:

バージョン=10.2.0.1(バージョン=major.minor.release.buildnumber)

変えたくないビルド番号このバージョン番号では。sedコマンドを使用してメジャー、マイナー、バージョンを変更したいと思います。

既存の

version=10.20.0.1

出力したいversion=11.21.2.1 (ビルド番号は変更しないでください(私のビルドの最後の部分))。

私は次のコマンドを使用します

sed -i -r s/version=(.*)/version=11.21.2/g <filename>

それが提供する出力は次のとおりです。

version=11.21.2 

これは私の要求ではありません。

答え1

互換性のあるsedコマンドは次のとおりです。

$ sed 's/version=[1-9]\+[0-9]*\.[0-9]\+\.[0-9]\+/version=11.21.2/' <<<'version=10.20.0.1'
version=11.21.2.1

または次のように:

sed 's/version=[1-9]\+[0-9]*\(\.[0-9]\+\)\{2\}/version=11.21.2/' <<<'version=10.20.0.1'

または次のように:

sed -E 's/version=[1-9]+[0-9]*(\.[0-9]+){2}/version=11.21.2/' <<<'version=10.20.0.1'

または、以下のように、バージョンMajor_numberが負とリリース部分のようにゼロで始まる可能性があります。

sed -E 's/version=([0-9]+\.){3}/version=11.21.2./' <<<'version=10.20.0.1'

答え2

ここでは、バージョン文字列(数字以外の文字列)がピリオドで区切られた4つのフィールドで構成されていると仮定する必要があります。したがって、最後のエントリを正規表現のLHSでキャプチャしてください。

また、行の先頭に最初に焦点を合わせ、文字の後ろのversion=部分だけをタッチすることをお勧めします=\エスケープがシェルからプリエンプトされないように、正規表現を一重引用符で囲みます。また、後で使用するために保管しないため、試合中や(周辺を使用する必要はありません。)

sed -i -r '/version=/s/=.*\.[0-9][0-9]*$/version=11.21.2/g' <filename>

上記では、最後のフィールドに複数の数字が許可されています。次のような場合は、任意の文字を入れることができます。

sed  -r '/version=/s/=.*\.([^.]*)$/=11.21.2.\1/g' <filename>

任意の変更を入力に渡すには、次のように話します。

newver=11.21.2
sed  -r '/version=/s/=.*\.([^.]*)$/='${newver}'.\1/g' <filename>

答え3

置き換えるバージョン文字列の部分をコマンドがどのように知っていますか?.*残りの行全体と一致するため、すべての項目が置き換えられます。

これで、置換する3つの数字のみが一致するパターンを定義したり(α sнιnが答えで異なる方法で行った方法)、次の引用符を使用してビルド番号を維持できますs/=.*(\..*)/=11.21.2\1/。リテラルポイントと一致するため、\.最後のポイントとそれ以降のすべての項目は最初のポイントと一致することはできません.*。したがって、ビルド番号が一致します(\..*)。これを入力すると、()交換時にアクセスできます\1

α sнιιの答えにある正規表現よりも簡単なので、この答えを追加しています。多分味の問題かもしれません。

関連情報