我想使用以下简单的Perl命令行删除<p>文件中的所有属性:
$ perl -pe 's/<p[^>]*>/<p>/' input.html但是,它不能替代例如跨多行的<p class="hello">,例如
<p
class="hello">因此,我首先尝试删除行尾,方法是
# command-1
$ perl -pe 's/\n/ /' input.html > input-tmp.html
# command-2
$ perl -pe 's/<p[^>]*>/<p>/g' input-tmp.html > input-final.html问题:
发布于 2011-10-25 09:25:03
-p是缩写
LINE: while (<>) {
...
} continue {
print
or die "-p destination: $!\n";
}如您所见,$_一次只包含一行,因此模式不可能匹配跨越多行的内容。您可以愚弄Perl,使其认为整个文件是使用-0777的一行。
perl -0777 -pe's/<p[^>]*>/<p>/g' input.html命令行选项记录在perlrun中。
发布于 2011-10-25 13:25:46
如果您编写了一个简短的脚本,并将其放入自己的文件中,那么您可以使用一个简单的命令行轻松地调用它。
改进以下脚本是一项练习:
#!/usr/bin/perl
use warnings; use strict;
use HTML::TokeParser::Simple;
run(\@ARGV);
sub run {
my ($argv, $opt) = @_;
my $el = shift @$argv;
for my $src (@$argv) {
clean_attribs($src, $el, $opt);
}
}
sub clean_attribs {
my ($src, $el, $opt) = @_;
my $el_pat = qr/^$el\z/;
my $parser = HTML::TokeParser::Simple->new($src, %$opt);
while (my $token = $parser->get_token) {
if ($token->is_start_tag($el_pat)) {
my $tag = $token->get_tag;
print "<$tag>";
}
else {
print $token->as_is;
}
}
}发布于 2011-10-25 13:54:58
perl -pe 'undef $/; s/<p[^>]*>/<p>/g'
https://stackoverflow.com/questions/7886634
复制相似问题