ファイル名はtype.xmlで、何百ものさまざまなエントリがリストされています。
次のようになります。
<type name="CanisterGasoline">
<nominal>50</nominal>
<lifetime>28800</lifetime>
<restock>0</restock>
<min>30</min>
<quantmin>-1</quantmin>
<quantmax>-1</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="tools"/>
<tag name="shelves"/>
<usage name="Industrial"/>
</type>
<type name="Canteen">
<nominal>20</nominal>
<lifetime>14400</lifetime>
<restock>0</restock>
<min>10</min>
<quantmin>10</quantmin>
<quantmax>90</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="food"/>
<usage name="Military"/>
</type>
基本的に何を言っても<nominal>20</nominal>
数字をゼロから間に変更したいと思います。<nominal>
</nominal>
お時間をいただきありがとうございます!
答え1
これを行うには、sed
次のことができます。
sed 's@<nominal>[0-9]*</nominal>@<nominal>0</nominal>@' types.xml > output.xml
<nominal>
次の一連の数字をで</nominal>
置き換えます<nominal>0</nominal>
。
しかし、なぜこのタスクに専用のXMLパーサーを使用するのか、どのパーサーを使用するのか、どのように使用するのかという提案がすぐに誰かが出てくると確信しています。
答え2
XML文書の形式が正しいと仮定し(例にルートノードがありません)、nodeの値が20の場合、xmlstarlet
次のように-node値を0に置き換えることができます。nominal
xmlstarlet ed -u '//nominal[text() = 20]' -v 0 types.xml
これはed
、入力文書()内の値が20()のすべてのノードを更新()し、そのノードの値を0()に設定してデータを編集()します。-u
nominal
//nominal
[text() = 20]
-v 0
サンプル文書にルートノードを追加し、この結果を実行します。
<?xml version="1.0"?>
<root>
<type name="CanisterGasoline">
<nominal>50</nominal>
<lifetime>28800</lifetime>
<restock>0</restock>
<min>30</min>
<quantmin>-1</quantmin>
<quantmax>-1</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="tools"/>
<tag name="shelves"/>
<usage name="Industrial"/>
</type>
<type name="Canteen">
<nominal>0</nominal>
<lifetime>14400</lifetime>
<restock>0</restock>
<min>10</min>
<quantmin>10</quantmin>
<quantmax>90</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="food"/>
<usage name="Military"/>
</type>
</root>
親ノードの値xmlstarlet
など、文書の他の値で値を更新することもできます。restock
xmlstarlet ed -u '//nominal[text() = 20]' -x '../restock/text()' types.xml
コマンドラインの直後またはオプションを指定すると、xmlstarlet
ユーティリティで内部編集を実行できます。-L
--inplace
ed
答え3
またはregex
「逆参照」を使用してください。
sed 's@\(<nominal>\)[0-9]*\(</nominal>\)@\10\2@' types.xml