2012-01-09 42 views
1

我有一个很长的线,在这里我想找到所有的链接时,他们随后class="filelink"如何进行单行搜索?

的链接可能看起来像这样

<a href="https://example.com/@api/files/123/=2008.pdf" class="filelink" 

这样的问题是如何写成一个Perl一个班轮?

更新

如果我做

echo '<a href="https://example.com/@api/files/123/=2008.pdf" class="filelink"' > test 
perl -pe 's/href="(.*)" class="filelink"/\1/g' test 

然后我得到

<a https://example.com/@api/files/123/=2008.pdf 

,我本来期望

https://example.com/@api/files/123/=2008.pdf 

回答

3
perl -nE'say for m/<a\s+href="([^"]+)"\s+class="filelink"[^>]*>/g;' 
+0

当我追加'test'你命令我没有看到任何输出。 'test'是我在文章中描述的文件。我用错了吗? – 2012-01-09 15:35:49

+0

@SandraSchlichting你需要把'''放在'echo'行的末尾。 – 2012-01-09 15:38:23

+0

'perl -pnE'和你的'说for'技巧有什么区别? – 2012-01-09 15:50:40

10

解决方案具有强大的HTML解析器代替正则表达式:

<input_long_line.html perl -MWeb::Query=wq -ne ' 
    wq($_) 
    ->find("a.filelink") 
    ->each(sub { 
     printf "URL %s\t text %s\n", $_[1]->attr("href"), $_[1]->text 
    })' 

我包好可读性,它运行良好作为一个班轮。

2

使用HTML::TreeBuilder::XPath,我觉得这是相当不错的替代方法:

M=HTML::TreeBuilder::XPath; \ 
perl -M$M -le 'print $_->attr("href") for ' \ 
      -e "$M->new_from_content(<STDIN>)->" \ 
      -e 'findnodes(q(//a[@class="filelink"]))' < input-file