XMLファイルで指定されたタグ内にタグ文字チェーンを埋め込むxmlstarletコマンドは何ですか?
例:タグが表示されるすべてのアイテムを検索<b>
し、そのタグがタグ内にある場合にのみ削除します<c> ... </c>
。
- 入力例:
<c>This is <b>an example</b>. <a>This is <b>a test;</b></a></c>
- 希望の出力:
<c>This is an example. <a>This is <b>a test;</b></a></c>
要約のために、例の2番目の文を保持します。
<a>This is <b>a test;</b></a>
しかし、これが問題になったら無視しても構いません。
ベストアンサー1
--update
ノードの値を//c/b
親ノードにコピーし、--delete
現在不要なノードを削除するだけですb
。
これは私が最後に取ったアプローチに似ています。あなたの質問に対する以前の答えの1つxmlstarlet
、最初に処理する必要があるすべてのノードのコレクションを保持する内部変数を作成し、そのノードを処理します。更新および削除操作のために同じノードセットにアクセスしやすくするために、これを行います。以前の答えでは、必要しかし、ここでは読みやすさのためです。
xmlstarlet ed \
--var 'path' '//c/b' \
--update '$path/../text()[1]' --expr 'concat(., $path/text())' \
--delete '$path' file.xml
ここでの更新は、b
ノードの親ノードに対するものではなく、親ノードに対するものであることに注目する価値があります。最初のテキスト値、text()[1]
.サンプル文書では、ノードの親ノードの最初のテキスト値は//c/b
文字列ですThis is
。これ第二テキスト値はノード.
の後に続きますb
。何も選ばないと[1]
結局
<?xml version="1.0"?>
<c>This is an example. an example<a>This is <b>a test;</b></a></c>
つまり、文字列はノードの2つのテキスト値の後にan example
挿入されます。c
今私達は得ます。
<?xml version="1.0"?>
<c>This is an example. <a>This is <b>a test;</b></a></c>