20

概要:ノード内のテキストを毎週自動的に変更する Bash スクリプトを作成する必要があります。スクリプトはノードに一致し、その中のテキストを置き換えますか (可能な場合)? どうすればいいですか?

長い要約: 私は、/ShowcaseStandalone/ffs-storage/ ディレクトリに独自の .xml ファイルを持つショップを持つ Minecraft サーバーをホストしています。毎週日曜日に、サーバーが再起動し、端末に対していくつかのコマンドを実行して、いくつかのことをリセットします。私が変えようとしているのは、あるお店です。ノード <itemstack> のテキストとノード <price> のテキストを変更したいと考えています。別のフォルダーにある .txt ファイルからテキストを取得し、そのノードに挿入したいだけです。問題は、ノード内のテキストが毎週変わることです。bash を使用して 2 つのノード内の特定の行またはテキストを置き換える方法はありますか?

XML ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<scs-shop usid="cac8480951254352116d5255e795006252d404d9" version="2" type="storage">
    <enchantments type="string"/>
    <owner type="string">Chadward27</owner>
    <world type="string">Frisnuk</world>
    <itemStack type="string">329:0</itemStack>
    <activity type="string">BUY</activity>
    <price type="double">55.0</price>
    <locX type="double">487.5</locX>
    <locY type="double">179.0</locY>
    <locZ type="double">-1084.5</locZ>
    <amount type="integer">0</amount>
    <maxAmount type="integer">0</maxAmount>
    <isUnlimited type="boolean">true</isUnlimited>
    <nbt-storage usid="23dffac5fb2ea7cfdcf0740159e881026fde4fa4" version="2" type="storage"/>
</scs-shop>

オペレーティング システム: Linux Ubuntu 12.04

4

3 に答える 3

19

次のようにファイルxmlstarletを編集するために使用できます。XMLshell

xmlstarlet edit -L -u "/scs-shop/price[@type='double']" -v '99.66' file.xml

ノート

  • "/scs-shop/price[@type='double']"Xpath式です
  • 見るxmlstarlet ed --help
于 2012-11-13T22:46:58.913 に答える
13

XML の方法はクールですが、通常の bash ツールを使用する必要がある場合は、sed を使用して行を変更できます。例えば:

PRICE=123
sed -i "s/\(<price.*>\)[^<>]*\(<\/price.*\)/\1$PRICE\2/" $XML_FILE_TO_MODIFY

これにより、価格が 123 に置き換えられます。

その sed コマンドは難しそうに見えるので、分解してみましょう。

\(<price.*>\)[^<>]*\(<\/price.*\)合わせるパターンです。 \(...\)グループ化のための括弧です。 <price.*>開始値札と一致します。[^<>]*山かっこ以外のすべてに一致し、この場合は値札の内容に一致します。<\/price.*値札の末尾に一致します。sedではスラッシュは区切り文字なので、バックスラッシュでエスケープしています。

\1$PRICE\2一致したテキストを置き換えるテキストです。 \1最初に一致した括弧グループを参照します。これは、開始価格タグです。 $PRICE希望の価格を含む変数です。 \22 番目の括弧グループ (この場合は終了タグ) を参照します。

于 2012-11-13T23:24:47.403 に答える
2

xmlstarlet を使用する余裕はありませんでした。インライン置換を行うだけで解決策が見つかりました。

テンプレートパラメータ.xml

<ns:Parameter>
    <ns:Name required="true">##-ParamName-##</ns:Name>
    <ns:Value>
        <ns:Text>##-ParamValue-##</ns:Text>
    </ns:Value>
</ns:Parameter>

スニペット

tokenName="foo"
tokenValue="bar"    

#Replace placeholders in parameter template element
myParamElement=$(cat template-parameter.xml)
myParamElement=${myParamElement//##-ParamName-##/$tokenName}
myParamElement=${myParamElement//##-ParamValue-##/$tokenValue}  

結果

<ns:Parameter>
    <ns:Name required="true">foo</ns:Name>
    <ns:Value>
        <ns:Text>bar</ns:Text>
    </ns:Value>
</ns:Parameter>
于 2016-09-21T20:42:29.773 に答える