
テキストファイル(子要素の数が不明なXML要素)の複数行を別々のテキストファイルの内容に置き換えようとしています。私はPerlを使ってほとんどの置換を成功させましたが、置き換えたい文字列の後に余分な空行を挿入して削除したいと思います。 Perlコマンドと入力ファイルと代替ファイルを示すコードについては、以下のコードを参照してください。
余分な空行が現れるのを防ぐ方法を知っている人はいますか?必要に応じて、Perl以外のものを使用する意思があります。
==> cat test.xml
<root>
<values>
<value>1</value>
<value>2</value>
<value>3</value>
</values>
</root>
==> cat replace.xml
<values>
<value>4</value>
<value>5</value>
</values>
==> perl -i -p0e 's;<values>.*<\/values>;`cat replace.xml`;sge' test.xml
==> cat test.xml
<root>
<values>
<value>4</value>
<value>5</value>
</values>
</root>
==>
答え1
一日中この問題で気がついて、ここに質問をするとすぐに見つけました。
Perlコマンドの検索基準に改行文字を含めることで問題を解決できました。閉じるxmlタグの後にすでに存在する改行文字をそのままにして、 "cat"コマンドで追加の改行文字を追加するようです。
perl -i -p0e 's;<values>.*<\/values>\n;`cat replace.xml`;sge' test.xml
編集:mosvyの答えのおかげで、置き換えるテキストに末尾の改行文字がない場合に動作する別の解決策が見つかりました(私の場合のように)。
perl -i -p0e 's;<values>.*<\/values>;`head -c -1 replace.xml`;sge' test.xml
catの代わりにheadを使用すると、追加の改行は出力されません。
答え2
$ perl -00pe '
chop($r //= join "", <STDIN>);
s|<values>.*</values>|$r|sg;
' test.xml < replace.xml