2017-04-21 15 views
1

単一のシェルスクリプト内のpom.xmlファイルから複数のバージョン番号を変更しようとしていますが、コンポーネントのバージョン番号がわからないことがあります。私はバージョンを解析することはできますが、そのバージョンをインラインで置き換えることはできません。awk/sedを使ってインラインでXMLを解析/置換する

のpom.xmlは、このようなものになります。

... 
     <dependency> 
      <groupId>abc.efg</groupId> 
      <artifactId>service1</artifactId> 
      <version>0.0.10</version> 
     </dependency> 
     <dependency> 
      <groupId>abc.efg</groupId> 
      <artifactId>service2</artifactId> 
      <version>0.1.5</version> 
     </dependency> 
     <dependency> 
      <groupId>abc.efg</groupId> 
      <artifactId>service3</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
... 

を私はこれは少しずさんである場合ので、私を許してシェルスクリプトに完全に新しいんだけど、これはこれまで私は次のようにgrepのを架線サービスバージョンを引くことができます;

$ grep -A 1 "service1" pom.xml | grep -Eo '[.0-9]*' 
$ 0.0.10 

が、インラインを置き換えるためのawkを使用すると、私が探している

$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | sed 's/[,0-9]/3.2.1/g' 
$ 3.2.1.3.2.1.3.2.1 

出力がある挑戦証明されています

0.0.10 - > 3.2.1

$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | #sedsyntax 
$ 3.2.1 

この時点でアドバイスや指針があれば幸いです

+1

XML/HTMLパーサ(xmllint、xmlstarletを...)を使用します。 – Cyrus

答えて

1

sedを使用してすべてを一度に実行できます。 パターンを検索し、次の行に移動してバージョン番号を置き換えます。

$ sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file 
<xml> 
    <dependency> 
    <groupId>abc.efg</groupId> 
    <artifactId>service1</artifactId> 
    <version>1.1.11</version> 
    </dependency> 
    <dependency> 
    <groupId>abc.efg</groupId> 
    <artifactId>service2</artifactId> 
    <version>0.1.5</version> 
    </dependency> 
    <dependency> 
    <groupId>abc.efg</groupId> 
    <artifactId>service3</artifactId> 
    <version>0.0.1</version> 
    </dependency> 
</xml> 

説明:

sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file 
     |________||___||_____________________|  
      |  |    | 
Pattern-----|  |    | 
Go next line--------|    | 
Replace Operation-------------------| 
-r switch (or -E) = Extended Regexp Support 
+0

ジョージはこれにスポットを当てています。詳細な説明とタイムアウトのために非常に感謝しています。 –

+0

'service12'を考慮して'> service1 <'にマッチします(pomの例には示されていません)。 –

0

あなたのsed式で直面する問題は、一度にすべての文字をキャプチャすることではありません。

$ echo "0.0.10" | sed 's/[.0-9]*/3.2.1/g' 
3.2.1 

この操作は、xmlstarletのようなXMLツールで行うことを強くお勧めします。

関連する問題