sed を使用して xml タグの 1 文字を別の文字に置き換えます。

sed を使用して xml タグの 1 文字を別の文字に置き換えます。

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...ノード値のすべての文字を置き換えようとしています。Tepisode-numから始まるS

xmlstarlet次のことができます。

xmlstarlet ed -u '//episode-num[starts-with(text(),"S")]' \
    -x 'translate(text(),"S","T")' file.xml

episode-num文書内の場所に関係なく、すべてのノードを変更できます。ただ修正したい場合特別なノードをクリックし、//episode-numXPath式をより正確なパスに変更します。

上記のサンプル文書では、上記の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"
      }
    ]
  }
}

おすすめ記事