XMLタグを見つけて、タグ内のテキストを複数のパラメータ値に置き換えます。

XMLタグを見つけて、タグ内のテキストを複数のパラメータ値に置き換えます。

特定のxmlタグを見つけて、タグ内のテキストをパラメータ化された値に置き換えます。何度も発生した場合は交換が必要です。

サンプルファイルの内容:

<a>abc</a>

現在の試み:

sed -i "s/\(<a>\).*\(<\/a>\)/\(<a>\)$param\(<\/a>\)/g" script.xml

希望の結果:param = 111の場合

<a>111</a>

答え1

私はあなたが解決策を望んでいることを知っていますが、通常、非常に単純なツールを除いて、XML文書を処理するときにsedXMLベースのツール(それらの多くがあります)を使用することをお勧めします。sed

これが私のXML文書(doc.xml)であるとしましょう。

<?xml version="1.0"?>
<xml>
    <c><a>abc</a></c>
    <b>
        <a>abc</a>
        <a>abc</a>
    </b>
    <a parm="FPM">abc</a>
</xml>

次のXMLスタイルシートを使用して、style.xsl文書を必要な形式に変換します。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name = "value" />

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="a/text()[.='abc']">
        <xsl:value-of select = "$value" />
    </xsl:template>

</xsl:stylesheet>

xsltprocほとんどの主要なLinuxディストリビューションにデフォルトでインストールされているツールを使用して変換を実行します。

$ xsltproc --stringparam value "111" style.xsl doc.xml
<?xml version="1.0"?>
<xml>
    <c><a>111</a></c>
    <b>
        <a>111</a>
        <a>111</a>
    </b>
    <a parm="FPM">111</a>
</xml>
$

答え2

XMLファイルを編集するために私が主に使用するツールはですxmlstarlet。これが私のXML文書です(doc.xml):

<?xml version="1.0"?>
<xml>
    <c><a>abc</a></c>
    <b>
        <a>abc</a>
        <a>abc</a>
    </b>
    <a parm="FPM">abc</a>
</xml>

これはxmlstarletコマンドです:

param=111
xmlstarlet edit --ps --update '//a' --value "$param" doc.xml

出力

<?xml version="1.0"?>
<xml>
    <c><a>111</a></c>
    <b>
        <a>111</a>
        <a>111</a>
    </b>
    <a parm="FPM">111</a>
</xml>

答え3

  1. \(\)あなたの場合は重複します。書くsed -i "s/<a>.*<\/a>/<a>$param<\/a>/g" script.xml
  2. 文字列にが含まれている場合は、/別の区切り文字を使用すると読みやすくなります。sed -i "s_<a>.*</a>_<a>$param</a>_g" script.xml
  3. このオプションは、g1行に複数のラベルがある可能性があることを示します。<a>問題は次のとおりです。 next、more、およびlastと.*一致するので、他のタグを含めないでください。</a><a>sed -i "s_<a>[^<]*</a>_<a>$param</a>_g" script.xml
  4. <a>$paramタグに他のタグがネストされている場合、または同じ特殊文字が含まれている場合、"この機能は機能しません。\

答え4

sedPerlは貪欲ではない一致をサポートしているので、代わりにPerlでこれを行います。

perl -i -pe "s|<a>.+?</a>|<a>$param</a>|g" file

.+?これは「できるだけ短い文字列と一致」を意味するため、anとanの間で最も短い文字列を見つけます。<a></a>

しかし、これは少し複雑なXML文書でも失敗する可能性が高く、専用のXMLパーサーの使用を考慮する必要があることを強調したいと思います。

関連情報