Perl

為什麼我的多行 perl 字元串替換添加了一個空行?

  • May 15, 2019

我正在嘗試用單獨的文本文件的內容替換文本文件(具有未知數量的子元素的 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>
==> 

在搞砸了一整天之後,我在這裡問了這個問題後幾乎立刻就明白了……

我能夠通過在 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 可以防止輸出額外的換行符

引用自:https://unix.stackexchange.com/questions/516228