2012-01-09 72 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