我在做sed /http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html提取链接。但是,由于sed缺少非贪婪的量词(之所以需要它,是因为行中又有“洪流”),因此请尝试将其转换为perl。虽然需要perl的帮助。 (或者,如果您知道如何使用sed,请这样说。)perl -ne s/.*(http.*?.torrent).*/\1/ 1.html现在,从sed转换后,我需要添加此部分:/http.*.torrent/p
这是sed /http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html
但这也不起作用; sed开始了,但没有退出,当我按下按键时,它们回响了,没有其他声音。

最佳答案

我建议让一个久经考验的模块(例如HTML::LinkExtor)为您完成繁重的工作,并使用正则表达式简单地验证它找到的链接。请参阅下面的示例,了解它是多么容易。

use Modern::Perl;
use HTML::LinkExtor;
use Data::Dumper;

my @links;


# A callback for LinkExtor. Disqualifies non-conforming links, and pushes
# into @links any conforming links.

sub callback {
    my ( $tag, %attr ) = @_;
    return if $tag ne 'a';
    return unless $attr{href} =~ m{http(?:s)?://[^/]*torrent}i;
    push @links, \%attr;
}


# The work is done here: Read the html file, parse it, and move on.
undef $/;
my $html = <DATA>;
my $p = HTML::LinkExtor->new(\&callback);
$p->parse( $html );

print Dumper \@links;

__DATA__
<a href="https://toPB.torrent" title="Download this torrent">The goal</a>
<a href="http://this.is.my.torrent.com" title="testlink">Testing2</a> <a href="http://another.torrent.org" title="bwahaha">Two links on one line</a>
<a href="https://toPBJ.torrent.biz" title="Last test">Final Test</a>
A line of nothingness...
That's all folks.

HTML::LinkExtor使您可以设置回调函数。模块本身会分析您的HTML文档以查找任何链接。您正在寻找“a”链接(而不是“img”等)。因此,在回调函数中,除非您具有“a”链接,否则您将尽快退出。然后测试“a”链接,以查看其中是否有“torrent”名称,位置合适。如果您不需要该特定的正则表达式,则必须更加具体,但我认为这是您所追求的。找到链接后,它们便被推送到数据结构上。在测试脚本的结尾,我将打印结构,以便您可以看到所拥有的内容。
__DATA__部分包含一些示例HTML代码段以及垃圾文本,以验证其仅在查找链接。

与构造易碎的正则表达式来完成整个工作相比,使用经过良好测试的模块来解析HTML更加持久。许多精心设计的解析解决方案在幕后包括正则表达式,但这只是在这里和那里做一点点的工作。当您开始依靠正则表达式进行解析(而不是识别小型构建块)时,您很快就会用尽精疲力尽。

玩得开心。

关于regex - sed/perl中的非贪婪正则表达式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6415217/

10-09 15:46