Как добавить строку, которая не начинается с '<' до предыдущей строки

У меня есть журнал, который содержит строки XML. Пример формата ниже:

<head> <body> <line> asdasd</line> </body> </head> 

Я хочу отсканировать файл журнала и добавить строки, которые не начинаются с '<' до предыдущей строки. Результат будет выглядеть следующим образом:

 <head> <body> <line>asdasd</line> </body> </head> 

благодаря

Перл на помощь!

 perl -pe 'print "\n" if /^\s*+</; chomp;' input > output 

т.е. новая строка удаляется из каждой строки, и она печатается, когда следующая строка начинается с пробела, а затем < .

Чтобы сохранить окончательную новую chomp unless eof , измените chomp на chomp unless eof или не добавьте END { print "\n" }

Думаю, я уже говорил об этом раньше, но с риском звучать как застрявшая запись. НЕ используйте регулярные выражения для анализа XML. Он хрупкий и склонный к взлому. Сначала я бы спросил: почему вы пытаетесь сделать то, что делаете? Потому что это должно быть неуместно при работе с вашим XML.

Вместо этого используйте синтаксический анализатор:

 #!/usr/bin/env perl use strict; use warnings; use XML::Twig; my $twig = XML::Twig->parsefile('your_file.xml'); foreach my $elt ( $twig->get_xpath('//#PCDATA') ) { $elt->set_text( $elt->trimmed_text ); } $twig->set_pretty_print('indented_a'); $twig->print; 

Это делает то, что вы хотите … но если вы действительно работаете с XML обычно, этот метод trimmed_text вероятно, удаляет необходимость этой обработки в любом случае.

Почти стандартная процедура sed

 sed '$!N;s/\n\(\s*[^<[:blank:]]\)/\1/;P;D' log.xml