0

sedを介した通常の検索/置換よりも少し複雑なもののbashスクリプトを作成しようとしています。私はbashCookbookという本を持っていて、そこからインスピレーションを得ようとしていますが、それほど遠くはありません。

基本的に、私は一連のmavenpom.xmlファイルのバージョン番号を自動的に更新するスクリプトを作成しようとしています。これが私が見ている一般的な設定です:

<!-- TEMPLATE:BEGIN
    <version>@@VERSION@@</version>
-->
    <version>1.0.0</version>
<!-- TEMPLATE:END -->

スクリプト(新しいバージョン番号1.0.1)を実行した後、代わりにファイルにこれを読み取らせたい:

<!-- TEMPLATE:BEGIN
    <version>@@VERSION@@</version>
-->
    <version>1.0.1</version>
<!-- TEMPLATE:END -->

したがって、これは実際のリリースpomファイルにあり、1.0.0が現在のバージョンです(そして私はそれを1.0.1か何かに置き換えようとしています)。明らかにバージョン番号が変更されるため、検索/置換を行うための良い方法はありません(検索したいものは可変であるため)。私はできるbashスクリプトを書くことができることを望んでいます

  1. @@VERSION@@を実際のバージョン番号に置き換えます
  2. 現在のバージョン行を削除する
  3. TEMPLATE:ENDの前の行に更新されたバージョン行を書き込みます(ファイル内の@@ VERSION @@を保持しながら、テンプレートを一時ファイルに書き込み、置換を実行してから、元に戻すことでこれを実行できますか?)

antスクリプトを使用して、これの一部(新しいファイルへの書き込み、置換の実行)を行うことができます。
<replace file="pom.xml">
<replacefilter token="@@VERSION@@" value="${version}"/>
</replace>

しかし、a。)古いバージョンの行を削除する、またはb。)新しい行を正しい場所にコピーするように指示する最善の方法がわかりません。誰かがこれを行う方法を知っているか、何かアドバイスがありますか?

4

3 に答える 3

3

新しいバージョン番号がシェル変数$VERSIONにあると仮定すると、次を使用できるはずです。

sed -e '/<!-- TEMPLATE:BEGIN/,/<!-- TEMPLATE:END -->/{
        s/<version>[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*<\/version>/<version>'$VERSION'<\/version>/
        }'

これは、のテンプレートバージョン行を無視し@@VERSION@@ますが、TEMPLATE:BEGINとTEMPLATE:ENDを含む行の間に表示される3つの部分からなるバージョン番号にのみ一致し、他のすべて(<version>...</version>要素を含む他の行を含む)はそのままにします。

ファイルの上書きを行う方法を決定できます(おそらく、のバージョンsedはGNUからのものであり、オプションを使用して要求に応じて自動的に行い-iます)。また、よりコンパクトな一致につながる、より強力な正規表現表記を使用できる場合もあります。ただし、これはほとんどのバージョンでsed変更なしで機能するはずです。

于 2012-05-25T21:44:25.007 に答える
1

概説した手順(1〜3)は、コメント内で定義されたテンプレート化されたルールに従って実際に置換を実行する必要がないかのように読みます。

そのため、ここでは、概説したように詳細に動作するコードをいくつか示します。

#!/bin/bash

file=$1
newversion=$2

sed -i $file -e "s|<version>\([^@]*\)</version>|<version>$newversion</version>|"

それを実行します:

chmod +x yourscript.sh
./yourscript.sh filetoupdate.xml 1.0.1
于 2012-05-25T21:44:48.110 に答える
0
use 5.010;
use strictures;
use Perl::Version qw();
use XML::LibXML qw();

my $dom = XML::LibXML->load_xml(location => 'pox.xml');

for my $node ($dom->findnodes('//version')) {
    my $version = Perl::Version->new($node->textContent);
    $version->inc_subversion;
    $version->stringify;
    $node->removeChildNodes;
    $node->appendText($version);
};

say $dom->toString;
于 2012-05-25T21:53:23.853 に答える