LINUX.ORG.RU

Как вырезать tag из html-файла?


0

0

Например есть html-файл:

<body><TAG 12312937> asldasjld
asdl'a;sld
asdas;dk;la
asdpl[asp
qwekopqkwe </TAG></body>

Как можно вырезать TAG вместе с содержимым,
то есть чтоб осталось только:

<body>
</body>

sed-ом не получается, по-мойму он понимает только то,
что в одной строке, а что на несколько разнесено, то не понимает.

Ответ на: комментарий от Selecter

действительно, перл попроще будет...
выдаёт на stdout переделанный текст, который берёт из stdin

#!/usr/bin/perl -w
use strict;
{
  my $r;
  {local $/;$r=<>;}
# если хочешь можно вот так
  $r=~s/<TAG(\s+\w+(\s*=\s*(\w+|'[^']*'|"[^"]*"))?)*\s*>//g;

# но проще вот так (не учитывает > внутри тега, то есть <TAG aaa="hello>world">
  $r=~s/<TAG(.*?)>//g;
  $r=~s/<\/TAG>//g;
  print $r;
}

vahvarh ★★★
()

А если удалить '\n' и вырезать sed'ом?

ugoday ★★★★★
()
Ответ на: комментарий от vahvarh

Что-то не работает:

$ cat tag.html
<body><TAG 12312937> asldasjld
asdl'a;sld
asdas;dk;la
asdpl[asp
qwekopqkwe </TAG></body>

$ cat remtag.pl
#!/usr/bin/perl -w

use strict;
{
        my $r;
        {local $/;$r=<>;}
        $r=~s/<TAG(.*?)>.*?<\/TAG>//mg;
        print $r;
}

$ cat tag.html | ./remtag.pl
<body><TAG 12312937> asldasjld
asdl'a;sld
asdas;dk;la
asdpl[asp
qwekopqkwe </TAG></body>

vasirck
() автор топика

2vasirck:

Тут тебе насоветовали использовать regular expressions из perl'а.
Для простых случаев regular expressions будут работать, однако
в общем случае regular expressions не умеют работать с balanced text
(а HTML и XML это balanced text).
Рекомендую ознакомиться с FAQ в http://perldoc.perl.org/perlfaq6.html
смотри вопрос "Can I use Perl regular expressions to match balanced text?"

HTH

Onanim
()
Ответ на: комментарий от Onanim

Мне не нужно общее, правильное решение, мне надо по паре десятков файлов пройтись, если что не так - увижу и поправлю. TAG не может быть вложенным, то есть внутри него могут быть другие теги, но таких же не может быть, я думаю, что в данном случае и regex можно обойтись. Мне надо чтоб хоть тот пример, что я привел заработал.

vasirck
() автор топика
Ответ на: комментарий от DKorolkov

Теперь другая проблема:

$ cat remtag.pl #!/usr/bin/perl -w

use strict; { my $r; {local $/;$r=<>;} $r=~s/<TAG(.*?)>.*?asd111.*?<\/TAG>//sg; print $r; }

$ cat tag.html <body><TAG 12312937> asldasjld asdl'a;sld asdas;dk;la </TAG><a>this should remain</a><TAG 3294823> asd111pl[asp qwekopqkwe </TAG></body>

$ cat tag.html | ./remtag.pl <body></body>

Хочу вырезать только второй тег, то есть в котором есть asd111, а вырезается всё. Как с этим бороться?

vasirck
() автор топика
Ответ на: комментарий от vasirck

Теперь другая проблема:

$ cat tag.html
<body><TAG 12312937> asldasjld
asdl'a;sld
asdas;dk;la
</TAG><a>this should remain</a><TAG 3294823>
asd111pl[asp
qwekopqkwe </TAG></body>

$ cat remtag.pl
#!/usr/bin/perl -w

use strict;
{
        my $r;
        {local $/;$r=<>;}
        $r=~s/<TAG(.*?)>.*?asd111.*?<\/TAG>//sg;
        print $r;
}

$ cat tag.html | ./remtag.pl
<body></body>

Т.е. хочу вырезать только второй тег, то есть в котором есть "asd111",
а вырезается всё. Как с этим бороться?

vasirck
() автор топика
Ответ на: комментарий от vasirck

#!/usr/bin/perl -w

use strict;
{
my $r;
{local $/; $r=<>;}
$r=~s!(<TAG(.*?)>.*?</TAG>)!replacer($1)!egs;
print $r;
}

sub replacer
{
$_[0] =~ /asd111/ ? '' : $_[0];
}

Хотя криво это все...

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.