为什么我的多行 Perl 字符串替换添加了一个空行?

为什么我的多行 Perl 字符串替换添加了一个空行?

我试图用单独的文本文件的内容替换文本文件(具有未知数量的子元素的 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

使用 head 而不是 cat 可以防止输出额外的换行符

答案2

$ perl -00pe '
    chop($r //= join "", <STDIN>);
    s|<values>.*</values>|$r|sg;
  ' test.xml < replace.xml

相关内容