ファイルの2つの矢印の間のすべての数字を0に置き換えるbashスクリプトが必要です。

ファイルの2つの矢印の間のすべての数字を0に置き換えるbashスクリプトが必要です。

ファイル名は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()に設定してデータを編集()します。-unominal//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--inplaceed

答え3

またはregex「逆参照」を使用してください。

sed 's@\(<nominal>\)[0-9]*\(</nominal>\)@\10\2@' types.xml

関連情報