Если я понимаю правильно, Вы хотите список каталогов, содержащих подкаталог, содержащий названный файл __openerp__.py
, без дубликатов.
В zsh:
print -rl -- **/__openerp__.py(:h:h) | sort -u
или
a=(**/__openerp__.py(:h:h)); print -rl -- ${(u)a}
Я думаю, что следующие должны помочь. Это обычная задача, которая должна сделать между двумя пределами.
unset f t
while read l
do
t=${t:+$t\\n}$l
l=${l//[<>]/}
: ${f:="$l"}
if [ "$l" = "/$f" ]
then
echo -e "$t" > "$f".xml
unset f t
fi
done < <(cat your_xml_file)
Во-первых - я скажу, что думаю, что это довольно плохая идея делать парсинг XML с чем-либо, кроме парсера XML. Регулярные выражения могут выглядеть как будто они будут работать, но это действительно хороший способ сделать некоторый хрупкий код - XML, который семантически эквивалентен, может выглядеть по-другому с разными RE (такими как отступы/линии и одинарные теги).
Так что, имея это в виду - я бы использовал Perl и библиотеку XML::Twig
. Это довольно стандартная вещь - пребилдированные пакеты доступны повсеместно.
Однако, возможно, самое главное - размещенный вами XML НЕ действителен. Я собираюсь предположить, что это потому, что это образец, а не настоящий XML, и поэтому вы немного пропустили. Я использую в качестве примера:
<root>
<unix>
<mm />
</unix>
<osx>
<nn />
</osx>
</root>
И использование этого кода сделает то, о чем вы просите:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->parsefile("your_xml.xml");
foreach my $element ( $twig->root->children ) {
my $tag = $element->tag;
print "Processing $tag\n";
#print to STDOUT for debugging
print $element ->sprint;
#print to output file
open( my $output, ">", "$tag.xml" ) or warn $!;
print {$output} $element->sprint;
close($output);
}
Если, конечно, ваше сообщение XML является буквально тем, что у вас есть, то это сломанный XML, и в идеале вы должны пойти и ударить того, кто дал вам его, свернутой копией документа спецификации. Если это непрактично, так как это реальная жизнь, то я бы предложил вам этот ответ на Stack Overflow: https://stackoverflow.com/a/28913945/2566198