特定のxmlタグを見つけて、タグ内のテキストをパラメータ化された値に置き換えます。何度も発生した場合は交換が必要です。
サンプルファイルの内容:
<a>abc</a>
現在の試み:
sed -i "s/\(<a>\).*\(<\/a>\)/\(<a>\)$param\(<\/a>\)/g" script.xml
希望の結果:param = 111の場合
<a>111</a>
答え1
私はあなたが解決策を望んでいることを知っていますが、通常、非常に単純なツールを除いて、XML文書を処理するときにsed
XMLベースのツール(それらの多くがあります)を使用することをお勧めします。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
\(\)
あなたの場合は重複します。書くsed -i "s/<a>.*<\/a>/<a>$param<\/a>/g" script.xml
- 文字列にが含まれている場合は、
/
別の区切り文字を使用すると読みやすくなります。sed -i "s_<a>.*</a>_<a>$param</a>_g" script.xml
- このオプションは、
g
1行に複数のラベルがある可能性があることを示します。<a>
問題は次のとおりです。 next、more、およびlastと.*
一致するので、他のタグを含めないでください。</a>
<a>
sed -i "s_<a>[^<]*</a>_<a>$param</a>_g" script.xml
<a>
$param
タグに他のタグがネストされている場合、または同じ特殊文字が含まれている場合、"
この機能は機能しません。\
答え4
sed
Perlは貪欲ではない一致をサポートしているので、代わりにPerlでこれを行います。
perl -i -pe "s|<a>.+?</a>|<a>$param</a>|g" file
.+?
これは「できるだけ短い文字列と一致」を意味するため、anとanの間で最も短い文字列を見つけます。<a>
</a>
しかし、これは少し複雑なXML文書でも失敗する可能性が高く、専用のXMLパーサーの使用を考慮する必要があることを強調したいと思います。