次の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
文字の発生を置き換えることができます。-
name
string
_
$ 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
単純な変換を適用します。出力は標準出力に書き込まれます。-
_