2011-06-20 76 views
3

我在做 sed /http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html 來提取鏈接。然而,由於sed缺乏非貪婪的量詞(這是因爲該行再次出現'torrent'),因此試圖將其轉換爲perl。雖然需要perl的幫助。 (或者,如果你知道如何使用sed做,這麼說。) perl -ne s/.*(http.*?.torrent).*/\1/ 1.html 現在我需要添加此部分,從convering之後的sed: /http.*.torrent/p在sed/perl中非貪婪的正則表達式匹配

這是的 sed /http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html

的一部分但這也沒用; sed開始但沒有退出,當我按下鍵時,他們迴應,沒有別的。

+0

如果您給出了一個輸入示例,說明了轉換它的規則並顯示了所需的輸出,那麼有人可以幫助您在Perl中完成,而無需弄清楚sed代碼正在嘗試和未執行的操作。 – d5e5

+0

'這是一個匹配行的例子,其他可以是任何東西:目標是提取https://toPB.torrent for每個這樣的行。' – ccvn

+0

你是否試圖解析完整的HTML頁面來提取'。洪流'鏈接?在這種情況下,您可能想挖掘[HTML :: TreeBulder](http://search.cpan.org/~jfearn/HTML-Tree-4.2/lib/HTML/TreeBuilder.pm)。 – ssapkota

回答

3

sed沒有非貪婪匹配,所以最好的辦法是隻使用perl

perl -ne '/.*?(http.*?.torrent)/ && print "$1\n"' 1.html 

-n參數告訴Perl來讀取輸入的每一行(從1.HTML在這種情況下, ,或者如果沒有文件在cmdline中,則從stdin開始),並針對每行運行一些內容...... -e在命令行中提供了「要執行的內容」。

表達式的第一部分與您正在查找的表達式匹配,圓括號將您感興趣的位捕獲到$1中。如果匹配,它的計算結果爲true,然後執行打印(給你匹配一個換行符)。

4

我建議讓一個經過很好驗證的模塊(如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'鏈接,看看是否有一個'洪流'的名字,在一個適當的位置。如果這個特定的正則表達式不是你所需要的,你必須要更具體,但我認爲這就是你所追求的。當鏈接被發現時,它們被推送到數據結構中。在我的測試腳本結尾處,我打印出結構,以便您可以看到您擁有的結構。

__DATA__部分包含一些示例HTML片段以及垃圾文本以驗證它僅查找鏈接。

使用經過良好測試的模塊來解析HTML比構造易碎的正則表達式來完成整個工作要持久得多。許多製作精良的解析解決方案都包含正則表達式,但只是在這裏和那裏做點小小的工作。當你開始依靠正則表達式來進行解析(而不是識別小的積木)時,你會很快耗盡氣體。

玩得開心。

+0

謝謝您提供豐富的答案。對於這個特殊情況,我不需要使用它,因爲這個模式非常簡單,但是我會記住HTML :: LinkExtor。 – ccvn