2つのXMLファイルがあります。
1.xml
<abc>
....
....
</abc>
<xyz attrib1='1234'>
...
...
</xyz>
2.xml
<abc>
xxx
xxx
</abc>
<xyz attrib2='4321'>
xxx
xxxx
</xyz>
最終ファイルを提供するには、シェルスクリプトを使用して1.xmlファイルの「xyz」タグの内容を2.xmlの内容に置き換える必要があります。たとえば、次のようになります。
<abc>
....
....
</abc>
<xyz attrib2='4321'>
xxx
xxxx
</xyz>
答え1
そしてsed
:
sed -n '/<xyz[ >]/,/<\/xyz>/p' 2.xml | \
sed '/<xyz[ >]/,/<\/xyz>/ { /<\/xyz>/! d; r /dev/stdin
D; }' 1.xml >output.xml
その後には改行文字が必要です/dev/stdin
。
sed
もう一つのきちんとしたが、あまり効率的な方法は次のとおりです。
{
sed '/<xyz[ >]/,$d' 1.xml
sed -n '/<xyz[ >]/,/<\/xyz>/p' 2.xml
sed '1,/<\/xyz>/d' 1.xml
} >output.xml
答え2
これを行う正しい(長いですが)方法は、汎用テキスト処理ツールではなくXML対応ユーティリティを使用することです。
たとえば、XSTL変換を使用すると、xsltプロセス:
xsltproc - 1.xml <<EOF
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Identity template (copy input to output) -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Replace //xyz with its counterpart from 2.xml -->
<xsl:template match="//xyz">
<xsl:copy-of select="document('2.xml')//xyz"/>
</xsl:template>
</xsl:stylesheet>
EOF
これは、テキストエンコーディング、フォーマット、エンティティ参照の使用などに関係なく、2.xml//xyz
を正しく置き換えます。1.xml
//xyz
答え3
sed "
/<xyz/,/<\/xyz>/c\
$(
sed -n '
/<xyz/{
:a;
N;
/<\/xyz>/! ba;
s/\n/\\&/gp;
}
' 2.xml
)
" 1.xml
私には簡単に行けるところだ2.xml()c
内の対応する行を次に変更してください。1.xml
注:このコマンドは複数行の入力を受け入れることができないため、行間に追加する必要がありc
ます。\
答え4
perl -0777ne ' # slurp xmls
$tag2 or ($tag2) = /(<xyz.*<\/xyz>)/s; # grab tag <xyz> from 2.xml
@ARGV or print s|<xyz.+?</xyz>|$tag2|srg; # replace tag <xyz> in 1.xml globally
' 2.xml 1.xml