Text-Processing

如何將不以’<‘開頭的行附加到上一行

  • November 17, 2015

我有一個包含 XML 行的日誌。範例格式如下:

&lt;head&gt;
   &lt;body&gt;
       &lt;line&gt;
asdasd&lt;/line&gt;
   &lt;/body&gt;
&lt;/head&gt;

我想掃描日誌文件並將不以“<”開頭的行附加到上一行。輸出如下:

&lt;head&gt;
   &lt;body&gt;
       &lt;line&gt;asdasd&lt;/line&gt;
   &lt;/body&gt;
&lt;/head&gt;

謝謝

Perl 來救援!

perl -pe 'print "\n" if /^\s*+&lt;/; chomp;' input &gt; output

即從每一行中刪除換行符,並在下一行以空格開頭時列印,然後是&lt;.

要保留最後的換行符,請更改chompchomp unless eof或添加END { print "\n" }

我想我之前已經說過了——但有可能聽起來像一張卡住的唱片——不要使用正則表達式來解析 XML。它很脆,容易折斷。不過,我首先要問的是-您為什麼要嘗試做您正在做的事情?因為在使用 XML 時它應該是無關緊要的。

而是使用解析器:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig-&gt;parsefile('your_file.xml');

foreach my $elt ( $twig-&gt;get_xpath('//#PCDATA') ) {
   $elt-&gt;set_text( $elt-&gt;trimmed_text );
}

$twig-&gt;set_pretty_print('indented_a');
$twig-&gt;print;

這可以滿足您的需求…但是如果您實際上是在正常使用 XML,那麼該trimmed_text方法可能無論如何都不需要進行此處理。

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