Я считаю, что правильным инструментом для задания является не a regex. Поскольку одно регулярное выражение не очень хорошо подходит для соответствия меток. Я бы вместо того, чтобы предложить использовать анализатор - это Perl фрагмент кода, который будет делать то, что вам требуется:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
print XML::Twig -> parse (\*DATA) -> get_xpath('//*',0) -> text;
__DATA__
<changes><comment>Testing
Comment
Footer
</comment></changes>
NB - пришлось очистить исходные данные, которые имели какие-то странные символы, когда я скопировал и вставил, который может на самом деле быть корнем вашей проблемы.
Это вы могли бы один лайнер, как:
perl -MXML::Twig -0777 'print XML::Twig->parse(<>)->get_xpath('//*',0)->text;' you_xml_filename
(Или это будет принимать входной сигнал на трубе).
Для более сложных сценариев, это не будет работать так же хорошо, но это довольно тривиально, чтобы приспособиться к более общим ярлыком зачистки:
Eg:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
print map { $_ -> text } XML::Twig -> parse (\*DATA) -> get_xpath('//#PCDATA');
__DATA__
<changes><comment>Testing
Comment
Footer
</comment>
<anothercomment>fish here
</anothercomment>
<some_other_tag an_attribute="some_attribute">More text here</some_other_tag>
</changes>
(XML::Twig
может потребоваться установка . Это должно быть просто, как cpan XML::Twig
или использовать диспетчера пакетов.)
В тексте 'changes' есть некоторые странные символы. Если я его скопирую, я вижу 'chan <200c><200b> ges'. – fedorqui
Похоже на XML. Это XML? Потому что, если это так, вы должны использовать синтаксический анализатор. – Sobrique