2013-05-11 71 views
1

我想從帶有shell/bash腳本的字符串中提取url,如果字符串中存在多個url,那麼只有第一個url應該被返回。如何從shell中的字符串中檢索url?

我在下面提供了一些輸入和輸出字符串的例子。我猜我需要做一些正則表達式,但我不太熟悉我將如何在bash/shell中做到這一點?

Input: Take a look at this site: http://www.google.com/ and you'll find your answer 
Output: http://www.google.com/ 


Input: http://www.google.com 
Output: http://www.google.com 


Input: Check out http://www.bing.com and http://www.google.com 
Output: http://www.bing.com 


Input: Grettings, visit <http://www.mywebsite.com> today! 
Output: http://www.mywebsite.com 
+2

有什麼事情你都做了嘗試解決這個問題?如果您告訴我們迄今爲止已嘗試的內容,我們將更願意回答您的問題。 (有用的鏈接,提出更好的問題:[問],[FAQ]) – Doorknob 2013-05-11 23:38:00

+0

現在我已經想過了,我同意。但我試圖在谷歌上搜索它,發現沒有確切的答案。我對bash或正則表達式不太熟悉,所以它不是最棒的組合。但我應該事先研究一下。 – user1015149 2013-05-11 23:55:40

回答

2

試試這個:

grep -Eo 'http://[^ >]+' yourFile|head -1 

例如:

kent$ echo "Check out http://www.bing.com and http://www.google.com"|grep -Eo 'http://[^ >]+'|head -1 
http://www.bing.com 
kent$ echo "Grettings, visit <http://www.mywebsite.com> today"|grep -Eo 'http://[^ >]+'|head -1 
http://www.mywebsite.com 
+0

謝謝,這似乎像一個魅力工作! 我要試着自己談談這一個,我想知道它爲什麼起作用。 所以你做了grep,默認情況下在每一行上搜索並返回找到匹配的整行。由於您啓用了-o標誌,因此只返回匹配的零件而不是整行。 您使用-E讓grep利用擴展正則表達式並像egrep一樣行事。任何特殊的原因,你不只是使用egrep? 'http://表示它必須以http://開頭。但是[^>] +的部分我不完全理解。 |頭-1使它只有第一次返回。 – user1015149 2013-05-12 00:09:31

+0

我讀了更多,[^]表示它會匹配任何不在括號內的字符。因爲>和空格在[]內,所以模式匹配遇到字符串中的空格或>字符時將「停止」。之後的+確保它重複,直到遇到空間或>。我對此有正確的理解嗎? – user1015149 2013-05-12 00:14:53

+1

如果您將'+ +替換爲'\ +',則不需要'-E'。 '[^>] +'表示任何不是(空格)或'>'(一次或多次)的字符。如果URL後面緊接着'',你可能需要添加'\ t'或者如果你的grep支持'-P',可以使用'-P'http:// [^ \ s>] +''。你也可以改成'https?// ....',因爲可能有'https:// url' – Kent 2013-05-12 00:18:08

1

使用grep命令,例如:

cat yourinput.txt | grep "your_regex_here" 
+0

他的問題是關於「your_regex_here」部分。也沒有'貓' – Kent 2013-05-11 23:47:22

+0

「貓沒有必要」,即:你可以把文件名作爲grep最後一個參數 – 2013-05-12 00:36:51