Unix コマンドを使用して、xml ファイル内の行を変数またはファイルに格納されている行のセットに置き換えるにはどうすればよいでしょうか?

Unix コマンドを使用して、xml ファイル内の行を変数またはファイルに格納されている行のセットに置き換えるにはどうすればよいでしょうか?

XMLファイルがあります

検索する必要がある行は次のとおりです。

SEARCH='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'

この検索された値は、次の変数の値に置き換える必要があります。また、別のファイルに保存することもできます。

REPLACE='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>
'

SED や AWK などの Unix コマンドを使用してこれを実行するにはどうすればよいですか? (ここでは、SEARCH を REPLACE に置き換える必要があります。

答え1

はい、sed で実行できますが、Jens に同意します。タグの検索と置換には、python + lxml ライブラリなどの適切なツールを使用することをお勧めします。

答え2

私が知る限り、エスケープする文字は次のとおりです。

awk '/<\?xml version="1.0" encoding="UTF-8" standalone="no"\?><SSC>/ {print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>"}' <<< '<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
  • 検索フィールドで、? 文字を \? でエスケープします。
  • REPLACEフィールドで、「\」で文字をエスケープします

または、変数を使用する必要がある場合は、検索フィールドでも " をエスケープし、文字を 2 回エスケープします。1 回は変数に格納し、2 回はエコーします。

SEARCH_escaped=`sed -e 's/\?/\\\?/g' -e 's/\"/\\\"/g' <<< $SEARCH`
REPLACE_escaped=`sed 's/\"/\\\"/g' <<< $REPLACE`

awk "/$SEARCH_escaped/ {print \"$REPLACE_escaped\"}" <<< $SEARCH

関連情報