Имеем файл, его содержимое в многостроку<dia>
bla
bla
</dia>нужно получить содержимое между <dia></dia>
> Имеем файл, его содержимое в многостроку
> <dia>
> bla
> bla
> </dia>
> нужно получить содержимое между <dia></dia>Варианты:
1) Самый простой - перефокусировать зрение, так ак инструмент не указан2) Читать в цикле файл, проверять совпадение подстрок, выводить требуемый строки между требуемыми подстроками.
3) Изичить скажем регекспы перла, и написать простенький в одну строку регексп
4) Изучить модуль разбора XML - написать крипт с использованием этого модуля.
5) Взять любой текстовый редактор и используя поиск и копипаст извлечь нужное содержимое
Мега полезные рекомендации конечно, а главное сколько полезной и нужной инофрмации вы преподнесли.
У меня к вам одна только просьба, не пишите большой такой ерунды.
>> Имеем файл, его содержимое в многостроку
>> <dia>
>> bla
>> bla
>> </dia>
>> нужно получить содержимое между <dia></dia>
> Варианты:
> 1) Самый простой - перефокусировать зрение, так ак инструмент не указанне уверен, но тэг perl проставлен -- может вопрошающий этот инструмент имел ...
> 2) Читать в цикле файл, проверять совпадение подстрок, выводить требуемый строки между
> требуемыми подстроками.
> 3) Изичить скажем регекспы перла, и написать простенький в одну строку регексп
> 4) Изучить модуль разбора XML - написать крипт с использованием этого модуля.
> 5) Взять любой текстовый редактор и используя поиск и копипаст извлечь нужное
> содержимое
Все верно уважемый.
> Все верно уважемый.каюсь, прошу простить, затролил не приглядевшись ))
примите скрипт в качестве подношения ))#!/usr/bin/perl -w
use strict;
$/ = undef;
open(MYFILE, "tmp2_emacs");
my $file = <MYFILE>;
close MYFILE;
$/ = "\n";
print "||$1||\n" while ($file =~ m!<bla>(.*?)<\/bla>!sg);
>[оверквотинг удален]
> каюсь, прошу простить, затролил не приглядевшись ))
> примите скрипт в качестве подношения ))
> #!/usr/bin/perl -w
> use strict;
> $/ = undef;
> open(MYFILE, "tmp2_emacs");
> my $file = <MYFILE>;
> close MYFILE;
> $/ = "\n";
> print "||$1||\n" while ($file =~ m!<bla>(.*?)<\/bla>!sg);да, я сразу тожа не разглядел
Дело в том что я уже делал нечто похожее, и оно не работает.$file = 'a_utf-8.lml';
open(F,"< $file");
@data = <F>;
close(F);$cc = '0';
while ( $#data> $cc){
print $data[$cc]=~m/<dia>(.*?)<\/dia>/imsg;
$cc++;
}
> Дело в том что я уже делал нечто похожее, и оно не
> работает.
> $file = 'a_utf-8.lml';название файла какбэ намекает .... что надо убедит в обоснованности названия, а затем погуглить на тему perl+utf8
> open(F,"< $file");нахера массив????? как потом искать многосрок?
> @data = <F>;
> close(F);
> $cc = '0';
> while ( $#data> $cc){
> print $data[$cc]=~m/<dia>(.*?)<\/dia>/imsg;естественно нихера не будет искать когда у вас строки в разных элементах
> $cc++;
> }мой скрипт проверен, и работает, каждая строка имеет смысл, возможно лишь проблема с utf8
>[оверквотинг удален]
>> @data = <F>;
>> close(F);
>> $cc = '0';
>> while ( $#data> $cc){
>> print $data[$cc]=~m/<dia>(.*?)<\/dia>/imsg;
> естественно нихера не будет искать когда у вас строки в разных элементах
>> $cc++;
>> }
> мой скрипт проверен, и работает, каждая строка имеет смысл, возможно лишь проблема
> с utf8Не не, дело не в utf-8
Просто я изначально не верно подошел к решению (тупанул), тут как бы масив построчно перебирается и понятное дело многостроки не словит.
echo '123<dia>
bla
bla
</dia>123' | perl -e 'my $mstr; while (my $str = <>) {$mstr.=$str;}; $mstr=~m@^.*?<dia>(.*?)</dia>@s; print $1;'
>[оверквотинг удален]
> каюсь, прошу простить, затролил не приглядевшись ))
> примите скрипт в качестве подношения ))
> #!/usr/bin/perl -w
> use strict;
> $/ = undef;
> open(MYFILE, "tmp2_emacs");
> my $file = <MYFILE>;
> close MYFILE;
> $/ = "\n";
> print "||$1||\n" while ($file =~ m!<bla>(.*?)<\/bla>!sg);Спасибо за рецепт, сработало.
Вы прощенны )))
> $/ = undef;
> open(MYFILE, "tmp2_emacs");
> my $file = <MYFILE>;
> close MYFILE;
> $/ = "\n";Хорошая идея. Это не ты спрашивал, что такое "Out of memory: Kill process 12866 httpd score 883 or sacrifice child" ?
Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:
while(<>) {
if (m!<dia>!o .. m!</dia>!o) {
if (m!<dia>(.+)|(.+)</dia>!o) {
print "$1\n";
} else {
print $_;
}
}
}
> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:а собственно в чем бессмысленность и беспощадность? )
>> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:
> а собственно в чем бессмысленность и беспощадность? )1. my $file = <MYFILE>;
Ничего, что файл может оказаться потоком на пару петабайт?
2. $/ = "\n";
При включеном, например, :crlf?
Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный бардак.
Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского тона замечу, что сам удивился наличию flip-flop. Perl следует курить до просветления.
>>> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:
>> а собственно в чем бессмысленность и беспощадность? )
> 1. my $file = <MYFILE>;
> Ничего, что файл может оказаться потоком на пару петабайт?Первые два слова в топе "Имеем файл". К тому же формат XML like ...
Уважаемый, вам уже мерещаться потоки )) Надо отдыхать.> 2. $/ = "\n";
> При включеном, например, :crlf?И? Заранее то это известно ))
> Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный
> бардак.Родной, какой бардак - задачу уже решили )) бардака нет.
> Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского
> тона замечу, что сам удивился наличию flip-flop. Perl следует курить до
> просветления.Эко накрыло торарисча ...
>[оверквотинг удален]
>> 2. $/ = "\n";
>> При включеном, например, :crlf?
> И? Заранее то это известно ))
>> Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный
>> бардак.
> Родной, какой бардак - задачу уже решили )) бардака нет.
>> Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского
>> тона замечу, что сам удивился наличию flip-flop. Perl следует курить до
>> просветления.
> Эко накрыло торарисча ...ну что вы как маленькие спорите -- у вас кулаков поговорить нет чтоли.
задача решена -- идиала никто не скал, да его и не требовалось.
> ну что вы как маленькие спорите -- у вас кулаков поговорить нет чтоли.Действительно, что у вас, рук нету? ))
> идиала никто не скал
Но стремиться к нему надо?!
2АССА
из 13 поста у меня не заработало ((
вот так да: while(<>){print if !/dia/}
ну и в однострочнике из командной строки пришлось заслешивать !
perl -e 'while(<>){print if \!/dia/}' file (нет пределов совершенству!?)Но ведь с этими <dia> это частный случай, вырезания текста между тегами в HTML.
Ниже в общем виде.
> Имеем файл, его содержимое в многостроку
> <dia>
> bla
> bla
> </dia>
> нужно получить содержимое между <dia></dia>Раз пошла такая пьянка..
cat file | perl -pe 's/<.*?>//g;s/^\s+//'
cat file | perl -pe 's/<[^>]*>//g;s/^\s+//'