sed/awk を使用して pom.xml のバージョン番号を更新します。

sed/awk を使用して pom.xml のバージョン番号を更新します。

私はpom.xml次の形式を持っています:

<project>

<modelVersion>1.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

2.0.0、3.0.0、4.0.0などのようにsed/コマンドを実行するたびにawkmodelVersion番号を+1ずつ増やしたいと思います。pom.xml

したがって、コマンドを実行するときに予想される出力は次のようになります。

 <project>

<modelVersion>2.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

同じコマンドを再実行すると、出力は次のようになります。

 <project>

<modelVersion>3.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

どちらが好まれますか?どうすればいいですか?

答え1

次のawkスクリプトを使用します。

awk '/<modelVersion>/ {
        temp = $0
        sub(/.*<modelVersion>/, "", temp)
        sub(/\..*/, "", temp)
        incremented = temp+1
        sub(temp, incremented)
    }
    {   print   }
    '
  • を含むことがわかりましたmodelVersion
  • 行全体の一時コピーを作成します。
  • <modelVersion>その行(およびその前のすべての項目)のコピーから削除します。
  • 次に、最初のエントリを削除します。.そしてそれ以降のすべて。これにより、バージョン番号の最初のコンポーネントが残ります。例:42.0.042
  • 1を加えます(例:→ 43)。
  • 次に、入力行を修正して現在の数字を増分数字に置き換えます。

コマンドを実行しawk、出力をファイルに出力します。

ああ(上)' pom.xml> new.xml
出力が正しいことを確認してから

mv new.xml pom.xml

答え2

更新された例を見ると、おそらくGNU awkをmatch()の3番目の引数として使用したいと思います。

awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] a[2]+1 a[3]} 1' file

元のファイルを更新するには、上記awk -i inplace '...' fileにはとにかくGNU awkが必要です-i inplace


元の答え:これはおそらくmatch()の3番目の引数としてGNU awkを使用して欲しいものです。

awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] (++cnt) a[3]} 1' file

お客様の要件が明確ではなく、1つの値のサンプル入力を使用して値の増加をテストできず、予想される出力が提供されないため、上記はテストされていません。

関連情報