URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7809
[ Назад ]

Исходное сообщение
"Как прочесть в многострочнике содержимое между тегами"

Отправлено ЦапЦарапыч , 25-Ноя-13 08:40 
Имеем файл, его содержимое в многостроку

<dia>
bla
bla
</dia>

нужно получить содержимое между <dia></dia>


Содержание

Сообщения в этом обсуждении
"Как прочесть в многострочнике содержимое между тегами"
Отправлено Pahanivo , 25-Ноя-13 10:03 
> Имеем файл, его содержимое в многостроку
> <dia>
> bla
> bla
> </dia>
> нужно получить содержимое между <dia></dia>

Варианты:
1) Самый простой - перефокусировать зрение, так ак инструмент не указан

2) Читать в цикле файл, проверять совпадение подстрок, выводить требуемый строки между требуемыми подстроками.

3) Изичить скажем регекспы перла, и написать простенький в одну строку регексп

4) Изучить модуль разбора XML - написать крипт с использованием этого модуля.

5) Взять любой текстовый редактор и используя поиск и копипаст извлечь нужное содержимое


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ЦапЦарапыч , 25-Ноя-13 10:14 
Мега полезные рекомендации конечно, а главное сколько полезной и нужной инофрмации вы преподнесли.
У меня к вам одна только просьба, не пишите большой такой ерунды.

"Как прочесть в многострочнике содержимое между тегами"
Отправлено pavel_simple , 25-Ноя-13 10:30 
>> Имеем файл, его содержимое в многостроку
>> <dia>
>> bla
>> bla
>> </dia>
>> нужно получить содержимое между <dia></dia>
> Варианты:
> 1) Самый простой - перефокусировать зрение, так ак инструмент не указан

не уверен, но тэг perl проставлен -- может вопрошающий этот инструмент имел ...

> 2) Читать в цикле файл, проверять совпадение подстрок, выводить требуемый строки между
> требуемыми подстроками.
> 3) Изичить скажем регекспы перла, и написать простенький в одну строку регексп
> 4) Изучить модуль разбора XML - написать крипт с использованием этого модуля.
> 5) Взять любой текстовый редактор и используя поиск и копипаст извлечь нужное
> содержимое


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ЦапЦарапыч , 25-Ноя-13 10:31 
Все верно уважемый.



"Как прочесть в многострочнике содержимое между тегами"
Отправлено Pahanivo , 25-Ноя-13 11:15 
> Все верно уважемый.

каюсь, прошу простить, затролил не приглядевшись ))
примите скрипт в качестве подношения ))

#!/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);


"Как прочесть в многострочнике содержимое между тегами"
Отправлено pavel_simple , 25-Ноя-13 11:18 
>[оверквотинг удален]
> каюсь, прошу простить, затролил не приглядевшись ))
> примите скрипт в качестве подношения ))
> #!/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);

да, я сразу тожа не разглядел


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ЦапЦарапыч , 25-Ноя-13 11:23 
Дело в том что я уже делал нечто похожее, и оно не работает.

$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++;
}


"Как прочесть в многострочнике содержимое между тегами"
Отправлено Pahanivo , 25-Ноя-13 11:34 
> Дело в том что я уже делал нечто похожее, и оно не
> работает.
> $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


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ЦапЦарапыч , 25-Ноя-13 11:37 
>[оверквотинг удален]
>> @data = <F>;
>> close(F);
>> $cc = '0';
>> while ( $#data> $cc){
>> print $data[$cc]=~m/<dia>(.*?)<\/dia>/imsg;
> естественно нихера не будет искать когда у вас строки в разных элементах
>> $cc++;
>> }
> мой скрипт проверен, и работает, каждая строка имеет смысл, возможно лишь проблема
> с utf8

Не не, дело не в utf-8
Просто я изначально не верно подошел к решению (тупанул), тут как бы масив построчно перебирается и понятное дело многостроки не словит.


"Как прочесть в многострочнике содержимое между тегами"
Отправлено Etch , 25-Ноя-13 11:35 
echo '123<dia>
bla
bla
</dia>123' | perl -e 'my $mstr; while (my $str = <>) {$mstr.=$str;}; $mstr=~m@^.*?<dia>(.*?)</dia>@s; print $1;'

"Как прочесть в многострочнике содержимое между тегами"
Отправлено ЦапЦарапыч , 25-Ноя-13 11:33 
>[оверквотинг удален]
> каюсь, прошу простить, затролил не приглядевшись ))
> примите скрипт в качестве подношения ))
> #!/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);

Спасибо за рецепт, сработало.
Вы прощенны )))


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ACCA , 26-Ноя-13 04:05 
> $/ = 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 $_;
      }
   }
}


"Как прочесть в многострочнике содержимое между тегами"
Отправлено Pahanivo , 26-Ноя-13 07:51 
> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:

а собственно в чем бессмысленность и беспощадность? )


"Как прочесть в многострочнике содержимое между тегами"
Отправлено ACCA , 26-Ноя-13 11:30 
>> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:
> а собственно в чем бессмысленность и беспощадность? )

    1. my $file = <MYFILE>;
Ничего, что файл может оказаться потоком на пару петабайт?


    2. $/ = "\n";
При включеном, например, :crlf?


Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный бардак.


Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского тона замечу, что сам удивился наличию flip-flop. Perl следует курить до просветления.


"Как прочесть в многострочнике содержимое между тегами"
Отправлено Pahanivo , 26-Ноя-13 12:21 
>>> Давай попробуем не так бессмысленно и менее беспощадно к PerlIO:
>> а собственно в чем бессмысленность и беспощадность? )
>     1. my $file = <MYFILE>;
> Ничего, что файл может оказаться потоком на пару петабайт?

Первые два слова в топе "Имеем файл". К тому же формат XML like ...
Уважаемый, вам уже мерещаться потоки )) Надо отдыхать.

>     2. $/ = "\n";
> При включеном, например, :crlf?

И? Заранее то это известно ))

> Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный
> бардак.

Родной, какой бардак - задачу уже решили )) бардака нет.

> Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского
> тона замечу, что сам удивился наличию flip-flop. Perl следует курить до
> просветления.

Эко накрыло торарисча ...


"Как прочесть в многострочнике содержимое между тегами"
Отправлено pavel_simple , 26-Ноя-13 12:32 
>[оверквотинг удален]
>>     2. $/ = "\n";
>> При включеном, например, :crlf?
> И? Заранее то это известно ))
>> Разумеется, в случае <dia> задача упрощается. Но это не повод разводить винрарный
>> бардак.
> Родной, какой бардак - задачу уже решили )) бардака нет.
>> Мораль сей басни достаточно кратка - ".." a.k.a. "..." В оправдание менторского
>> тона замечу, что сам удивился наличию flip-flop. Perl следует курить до
>> просветления.
> Эко накрыло торарисча ...

ну что вы как маленькие спорите -- у вас кулаков поговорить нет чтоли.

задача решена -- идиала никто не скал, да его и не требовалось.


"Как прочесть в многострочнике содержимое между тегами"
Отправлено михалыч , 26-Ноя-13 13:03 
> ну что вы как маленькие спорите -- у вас кулаков поговорить нет чтоли.

Действительно, что у вас, рук нету? ))

> идиала никто не скал

Но стремиться к нему надо?!

2АССА
из 13 поста у меня не заработало ((
вот так да: while(<>){print if !/dia/}
ну и в однострочнике из командной строки пришлось заслешивать !
perl -e 'while(<>){print if \!/dia/}' file (нет пределов совершенству!?)

Но ведь с этими <dia> это частный случай, вырезания текста между тегами в HTML.
Ниже в общем виде.


"Как прочесть в многострочнике содержимое между тегами"
Отправлено михалыч , 25-Ноя-13 13:39 
> Имеем файл, его содержимое в многостроку
> <dia>
> bla
> bla
> </dia>
> нужно получить содержимое между <dia></dia>

Раз пошла такая пьянка..
cat file | perl -pe 's/<.*?>//g;s/^\s+//'
cat file | perl -pe 's/<[^>]*>//g;s/^\s+//'