2017-03-14 6 views
2

入力XMLファイル内の特定の値を置き換えるために、フリップフロップ演算子を使用しています。次のようにフリップフロップ演算子の出力を処理する

ファイル構造は次のとおりです。

<a>BLE</a> 
<-- hur dur --> 
<b>12345</b> 
<-- hur der --> 
<c>VER1.2.3</c> 
<-- hur dest --> 
<d>VER1.2.3</d> 

<a>CLE</a> 
<-- hur dur --> 
<b>12345</b> 
<-- hur der --> 
<c>VERX'.Y'.Z'</c> 
<-- hur dest --> 
<d>VERX'.Y'.Z'</d> 

<a>DLE</a> 
<-- hur dur --> 
<b>12345</b> 
<-- hur der --> 
<c>VERX".Y".Z"</c> 
<-- hur dest --> 
<d>VERX".Y".Z"</d> 
etc ... 

は、だから私は、任意の特定の変数のバージョンフィールド(DおよびC)を変更したいと言うことができます。簡潔にするために、それをBLEにしましょう。私は最初にBLEの値(行1〜7)でブロックを見つけてから、フィールドを新しい値に置き換えなければなりません。

私のような、さまざまなものをしようとしてきた:$の版は、設定された変数(版= "VERX.Y.Z")です

perl -pi.bak -ne 'if (/BLE/ .. /<\/d/){ s/VER[[:digit:]]\+\.[[:digit:]]\+\.[A-Z][[:digit:]]\+[A-Z]\?/$ver/}' dur.xml 

または

perl -ne "print if (/BLE/ .. /<\/d>/) " dur.xml | sed "/VER[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+[A-Z]\?/$ver/" 

。しかし、最初のものは入力ファイルに対して何もしません(私はインプレースでそれをやりたい)。二つ目は、私が欲しいものを多かれ少なかれ生成するが、出力はBLEブロックに制限されている:

<a>BLE</a> 
<-- hur dur --> 
<b>12345</b> 
<-- hur der --> 
<c>VERX.Y.Z</c> 
<-- hur dest --> 
<d>VERX.Y.Z</d> 

それはBLE以外の他のすべてをドロップするので、この出力は簡単>を持つファイルにリダイレクトすることができないこと。

上記と同様の方法で元のファイルを変更できる方法はありますか?

おかげでたくさん、 酒飲み

+1

その入力は実際のXMLであるはずですか?それはそれのようには見えません。 _exact_ファイルを含めてください。 – simbabque

+1

...また、ここではあなたのサンプルデータに 'buildversion'という文字列はありません... – jm666

+0

@simbabqueそれは実際にはXMLではありません - 私が編集しているファイルは拡張子が.xmlですが、構造はちょっとです類似。また、オリジナルはちょうどこのように見えます。タグa、b、c、dだけが異なる名前を持っています – drinker

答えて

1

ここで私はライン上で、それ

perl -pe's{<d>VER\K.*?(</d>)}{xxx$1} if m{BLE} .. m{</d>}' data.txt 

これは<d>VERxxxと(最初の)</d>との間にあるものは何でも置き換え見るようにタスクを実行するための一つの方法であります所定の範囲内である。 \Kので、我々はそれらをキャプチャしに戻ってそれらを配置する必要はありません前に、それまでの試合を破棄positive lookbehindの形である。

-pプリント$_たびに、あなたはすべての行を取得するようs{}{}は、それを変更しながら、印刷された、変更された、またはされないそれはそれと-n(同じですが印刷されません)の両方を持つ目的のサーバーではありませんが、それを行う場合は-pがもう一方を上書きします。ファイルを変更するには内にを実際にバックアップして-i.bakを追加します。 perlrun

を参照してください、あなたが代わりにあなたのコードをほのめかすどんな数を以下の任意の文字、を可能にするために正規表現

s{<d>VER\K(\d+)\.(\d+)\.(\d+)</d>}{$1.$new.$3</d>} 

を使用することができ、特定の番号にアクセスする必要がある場合は、(\d+[A-Z]?)を使用しています。 '"X'X"の場合は、これを調整してください(最初の例は問題ありません)。あなたが "Xプライム"(とダブルプライム)としてそれらを使用するつもりなら、ここでは非常に誤解を招くことがあります。

これをスクリプトに変換すると、これはおそらく良いアイデアです。これがシェルスクリプト内にある場合は、上記のリテラル(VERxxx)の代わりに変数を直接使用することができます。


掲載コードに問題は単に線を選択し、正しく使用し、「フリップフロップ」(range operator)、ではありません。正規表現では、最後の数字の前に[A-Z]があり、最後に数字が続きます。データには文字がないため、一致しません。

また、\?は、quantifier?をリテラル?に変換します。これはデータにも含まれていません。

+0

ありがとう@zdim。これはm {BLE} .. m {\/d} "dur.xml"の場合、{perl -i.bak -pe} { \ K. *?} {$ ver} – drinker