<ns:tag2>
LinuxのXMLファイルにあるXMLタグの値からスペースと引用符を削除したいです(このタグに対してのみスペースを削除し、他の場所では削除しません)。
XMLコンテンツの例は次のとおりです。
<ns:tag1>
<ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
</ns:tag1>
しかし、以下のようにファイルに書き込む必要があります。
<ns:tag1>
<ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
</ns:tag1>
私は次の解決策を見ました。XMLファイルからスペースと引用符を含む文字列を削除するsedコマンドを使用して引用符を削除しようとしましたが、成功しませんでした。
sed 's/ ""//g' temp.xml
正しい構文を提案してください。これを2つの異なるステップで行うことができれば良いでしょう。
答え1
これがタスクを実行するXSLT 3.0変換です。
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="ns:tag2/text()" xmlns:ns="xxxxx">
<xsl:value-of select="translate(., '" ', '')"/>
</xsl:template>
</xsl:template>
実際の名前空間URIに置き換えますxxxxx
(例では表示されません)。
語彙レベルでXMLを処理するには、sedなどの非XML認識ツールを使用しないでください。間違ったXMLを処理する必要がある人がStackOverflowで何百もの問題を抱えていることがわかります。
答え2
XMLパーサーを使用してXMLを解析できます。私はxmlstarlet
自分が好きです。
(とにかく)合理的な名前空間宣言を提供するためにあなたの例を修正しましたns
。
<ns:root xmlns:ns="localns">
<ns:tag1>
<ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
</ns:tag1>
</ns:root>
この時点で、スペースと引用符を次のように置き換えることができます。何もない:
xmlstarlet edit -N ns=localns -u '//ns:tag2/text()' -x "translate(., ' \"', '')" xmlfile
結果
<?xml version="1.0"?>
<ns:root xmlns:ns="localns">
<ns:tag1>
<ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
</ns:tag1>
</ns:root>