私は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
/コマンドを実行するたびにawk
modelVersion番号を+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.0
→42
。 - 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つの値のサンプル入力を使用して値の増加をテストできず、予想される出力が提供されないため、上記はテストされていません。