2011-12-14 56 views
1

我正在編寫一個腳本來從我的博客文章中獲取URL並在其上運行curl -I,以便我可以檢查它們是否仍然很好。但是我在編寫grep模式時遇到了麻煩。如何在博客中查找URL?

<p><a href="http://example.com/fujipol/2004/may/5/16:10:47/400x345">foobar</a></p> 

所以這裏我只想要http://example.com/fujipol/2004/may/5/16:10:47/400x345

還是在降價,如:

[Example markdown link](https://example.com) 

https://example.com

<http://example.com/?foo=bar> 

在這種情況下,我需要http://example.com/?foo=bar

回答

5

從你的例子鏈接創建文件:

$> cat ./text 
<p><a href="http://example.com/fujipol/2004/may/5/16:10:47/400x345">foobar</a></p> 
[Example markdown link](https://example.com) 
<http://example.com/?foo=bar> 
<a href="http://people.debian.org/~dilinger/backports/wordpress">http://people.debian.org/~dilinger/backports/wordpress</a> 

「Greped」這與一些正則表達式,並得到了所有從它的網址:

$> grep --only-matching --perl-regexp "http(s?):\/\/[^ \"\(\)\<\>]*" ./text 
http://example.com/fujipol/2004/may/5/16:10:47/400x345 
https://example.com 
http://example.com/?foo=bar 
http://people.debian.org/~dilinger/backports/wordpress 
http://people.debian.org/~dilinger/backports/wordpress 

完成。

http(s?):\/\/[^ \"\(\)\<\>]* 

我們在這裏所做的匹配http(s)(URL可以與http://https://啓動),比我們匹配//和逃脫它。最後我們匹配不等於"()<>的符號序列。

最後,在這樣的任務,整個問題想通了,我怎麼決定部分,我們需要開始(http(s)://在這種情況下)和結束("()<>)。

坦率地說,這個解決方案並不完美。一些網址標準提供了更多關於網址可以包含或不可以包含的符號的信息。所以,你馬上就會知道,在我的答案中使用的正則表達式是無效的。但在你描述的情況下,它的工作就是賣。

+0

在如下網址中:'http://people.debian.org/~dilinger/backports/wordpress'與'http:// people.debian.org /〜dilinger/backports/wordpress`和 'http://people.debian.org/~dilinger/backports/wordpress < /了`。我只想匹配如上所述的網址。 – hendry 2011-12-15 09:34:26