Пожалуйста, не используйте регулярные выражения на основе решение, например awk
или sed
.
XML
является контекстным, в то время как регулярные выражения не являются - , поэтому они НИКОГДА не могут работать должным образом, это в лучшем случае лишь небольшая хитрость .
Но у XML есть решение этой проблемы - он называется xpath
, что позволяет «искать» контекстным способом.
Итак, возьмем ваш пример:
#!/usr/bin/perl
use warnings;
use strict;
use XML::Twig;
my $xml = XML::Twig -> new -> parsefile('your_file.xml');
foreach my $wpt ( $xml -> get_xpath('//wpt') ) {
print join ",", $wpt -> att('lat'),
$wpt -> att('lon'),
$wpt -> first_child_text('time'), "\n";
}
Что дает желаемый результат, но также будет обрабатывать множество совершенно корректных и семантически идентичных форм вашего XML.
Как с отступом:
Все в одной строке:
Другой стиль отступа:
Или даже:
Все они семантически идентичны, и следует анализировать одинаково способ. Надеюсь, совершенно ясно, что регулярное выражение для этого НАМНОГО сложнее, чем использование парсера XML.
Для краткости:
perl -MXML::Twig -0777 -e 'XML::Twig->new(twig_handlers=>{wpt=>sub{print join ",", $_->att("lat", $_->att("lon"),$_->first_child_text("time"), "\n" }})->parse(<>)'