XML属性値をクリーンアップする方法

XML属性値をクリーンアップする方法

次のXMLがあります。

<string name="foo-bar">"bar-bar -bar"</string>
<string name="asdf_qwe-rty" translatable="false">"Lorem ipsum"</string>

これで、属性に文字をname含めることはできません。-_

<string name="foo_bar">"bar-bar -bar"</string>
<string name="asdf_qwe_rty" translatable="false">"Lorem ipsum"</string>

を使ってどうすればいいですかsed

ベストアンサー1

XML文書の形式が正しいと仮定すると、次のようにしてすべてのノード属性ですべてのxmlstarlet文字の発生を置き換えることができます。-namestring_

$ xmlstarlet ed -u '//string/@name' -x 'translate(.,"-","_")' file.xml
<?xml version="1.0"?>
<root>
  <string name="foo_bar">"bar-bar -bar"</string>
  <string name="asdf_qwe_rty" translatable="false">"Lorem ipsum"</string>
  <string name="_test1_">name="-test1-"</string>
  <!-- <string name="-test2-">name="-test2-"</string> -->
</root>

root(ドキュメント形式をうまく作るためにここにラッパーノードを追加し、ノード値やコメント内容に影響を与えないことを示すためにいくつかの追加事例を追加しました)。

このxmlstarlet式はXPath式を使用してすべての関連属性を見つけ、各属性値に//string/@node単純な変換を適用します。出力は標準出力に書き込まれます。-_

おすすめ記事