S
文字を次に置き換える必要がありますT
。
<episode-num system="onscreen">S1 E12</episode-num>
私の予想結果:
<episode-num system="onscreen">T1 E12</episode-num>
Gitがどのように深く機能するのかわかりませんが、XMLタグの対応する文字を変更するために使用し、フォーラムで調査した結果、いくつかの情報を見つけて次のコマンドラインを試しました。
sed -e :l -e 's@\(<episode-num system="onscreen">.*\)S\([^amp;]\)\(.*</episode-num>\)@\1T\2\3@;tl' guide.xml
しかし、うまくいきません。助けてください。
ベストアンサー1
次のXML文書があるとしましょう。
<data>
<episode-num system="onscreen">S1 E12</episode-num>
<episode-num system="onscreen">S1 S12</episode-num>
<episode-num system="onscreen">T1 S12</episode-num>
</data>
S
...ノード値のすべての文字を置き換えようとしています。T
episode-num
から始まるS
。
xmlstarlet
次のことができます。
xmlstarlet ed -u '//episode-num[starts-with(text(),"S")]' \
-x 'translate(text(),"S","T")' file.xml
episode-num
文書内の場所に関係なく、すべてのノードを変更できます。ただ修正したい場合特別なノードをクリックし、//episode-num
XPath式をより正確なパスに変更します。
上記のサンプル文書では、上記のxmlstarlet
コマンドは次のように生成します。
<?xml version="1.0"?>
<data>
<episode-num system="onscreen">T1 E12</episode-num>
<episode-num system="onscreen">T1 T12</episode-num>
<episode-num system="onscreen">T1 S12</episode-num>
</data>
とxq
(からhttps://kislyuk.github.io/yq/)のようなxmlstarlet
上記と:
xq -x '(.data."episode-num"[] | select (."#text"|startswith("S")))."#text" |= gsub("S";"T")' file.xml
これは、入力文書がサンプル文書と同じ構造を有すると仮定する。 XMLパーサーを使用して文書を解析し、内部的にJSONに変換します。生成されたJSONドキュメントを呼び出してjq
与えられた式を適用し、最後にすべてをXMLに変換します。
私が使用しているサンプル文書の場合、式が実際に適用される内部JSON文書はjq
次のとおりです。
{
"data": {
"episode-num": [
{
"@system": "onscreen",
"#text": "S1 E12"
},
{
"@system": "onscreen",
"#text": "S1 S12"
},
{
"@system": "onscreen",
"#text": "T1 S12"
}
]
}
}