1

ファイル replacetest.xml の一部のテキストを置き換えようとしています

これが、変更したいファイルの部分です。

<class name="replace_after_this_string">randomtext</class>

randomtext配列のインデックスにあるテキストでテキストを変更したい

orgs=( item1 item2 )

これらの変更でファイルを上書きします。

私の主な問題は、ワイルドカードとsedコマンドにあります。だからここに私が試したものがあります

orgs=( item1 item2 )

SRC="name="'"replace_after_this_string"'">"
#need some sort of wildcard here


for i in "${orgs[@]}"
do
:
    # do whatever on $i
    DST=$SRC$i

    sed -e 's/$SRC/$DST/g' -i replacetest.xml

done

1)randomtext変数に何が入るかを特定した後、置換することを指定するためにワイルドカードが必要です$SRC

2) 私の sed ステートメントは、コマンド ラインに逐語的に出力する以外は何も実行せず、コマンド ラインに出力されたものであっても、ファイルをまったく変更しません。

4

2 に答える 2

3

sed は XML ファイルの構造を理解していないため、これには不適切なツールだと思います。その結果、スクリプトをまったく機能させることができたとしても、スクリプトはかなり脆弱になります。Brian Agnew が彼の回答で示唆しているように、xmlstarletXML ファイルを操作するための便利なツールです。たとえば、ファイル (12477913.xmlなど) が次のようになっているとします。

<?xml version="1.0"?>
<foo>
  <class name="replace_after_this_string">randomtext</class>
  <class name="not_for_replacing">some other text</class>
</foo>

...次に、このコマンド:

xmlstarlet ed -u './/class[@name="replace_after_this_string"]' \
    -v 'REPLACED HERE' 12477913.xml

... 次の出力が生成されます。

<?xml version="1.0"?>
<foo>
  <class name="replace_after_this_string">REPLACED HERE</class>
  <class name="not_for_replacing">some other text</class>
</foo>
于 2012-09-18T13:40:52.490 に答える
2

あなたの質問に直接答えないことはわかっていますが、XML ファイルを変更するために XML 対応のものを使用したいと思います。そうすれば、エンティティと文字のエンコードに関する問題を回避し、整形式を維持できます。

コマンドライン XML ツールキットとしてXMLStarletをチェックする価値があります。

于 2012-09-18T13:26:59.823 に答える