0

私は次のようないくつかの属性を含むxmlファイルを持っています

<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again</value>
</string>

値(必ずしも「もう一度テキスト」である必要はありません)を文字列「none」で変更したいと思います。コマンドラインで次のことを試しました。

 awk '/<string name="my\/ attribute" optional="true">/,/<\/string>/ {sub(/<value>(.*)<\/value>/,"<value>none</value>")}1' my.xml > my_new.xml

これはどういうわけか問題なく動作しますが、結果は次のようになります。

<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again<\/value>
</string>

タグの/(スラッシュ)がエスケープされているのはなぜですか?

あなたの助けをどうもありがとう、

ダニエラ。

4

2 に答える 2

1

リチャードが指摘したあなたの質問の矛盾が偶然であると仮定すると:

$ cat input.xml
<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again</value>
</string>

$ awk '/<string/{doit=1} doit{sub(/<value>[^<]+<\/value>/, "<value>none</value>"); print} /<\/string>/{doit=0}' input.xml 
<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>none</value>
</string>

$ 

<value>これは、縮小されたXML(つまり、空白が削除され、すべてe行にある)を処理するという点で、スクリプトよりもWEE少し安全ですが、複数行に分割されたものは処理しません。

PerlのXML::SimpleまたはPHPのSimpleXMLを調べることをお勧めします。ワンライナーにはなりませんが、はるかに確実に機能します。

于 2012-09-07T11:37:28.190 に答える
0

XMLの処理に標準のテキストツールを使用しないでください。常にXMLツールを使用してください。そうしないと、あなた(またはあなたの顧客)は、このリストに質問を投稿して、処理するXMLの形式が正しくないという事実について何をすべきかを尋ねる何百人もの人々の中にいることになります。発生する可能性のあるすべてのエッジケースに対応して、手作業で正しく処理するのは非常に困難です。たとえば、開始タグと終了タグ内で空白が許可される場所の規則を知っていますか?サンプルコードから判断すると、そうではないようです。

于 2012-09-07T14:30:50.843 に答える