여러 줄의 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

cat 대신 head를 사용하면 추가 개행이 출력되지 않습니다.

답변2

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

관련 정보