2014-04-22 15 views
1

我想請求我的正則表達式的幫助。我需要從每個網址中提取最後一部分。我在下面的例子中將其標記爲'to_extract'。正則表達式幫助 - 有什麼不對?

我想知道用sed的使用時有什麼不對下面的正則表達式:file.txt的的

sed 's/^[ht|f]tp.*\///' file.txt 

示例內容:

http://a/b/c/to_extract 
ftp://a/b/c/to_extract 
... 

我只得到了FTP鏈接正確的結果,而不是http。 在此先感謝您對此的解釋。 i。

回答

8

[ht|f]更改爲(ht|f),這樣會給出更好的結果。

[abc]表示「一個字符是a,bc」。

[ht|f]的意思是 「一個字符是ht|f」,不是在所有你想要的。

在sed的一些版本中,你必須與-r選項調用它,以便擴展正則表達式可用於:

sed -r 's/^(ht|f)tp.*\///' file.txt 

如果你只是要提取的URL和唐的最後一部分「不想別的,你可能想

sed -rn 's/^(ht|f)tp.*\///p' file.txt 
+0

+1只是爲了信息,適用於GNU sed的,不是POSIX版本taht不允許'|' – NeronLeVelu

+2

沒有'-r'需要反斜線括號和豎線許多'sed'方言。你應該發現'sed'/ \(ht \ | f \)tp /''也可以與GNU'sed'一起使用。 – tripleee

+0

@tripleee感謝那些信息(我仍然保留我的答案,因爲我認爲使用r參數更具可讀性和方便性) –

1

怎麼樣使用 「基本名稱」:

basename http://a/b/c/to_extract  
to_extract  

你可以簡單地實現你想要的for循環。

#!/bin/bash 

myarr=($(cat ooo)) 

for i in ${myarr[@]}; do 

basename $i 

done 
+0

爲什麼在使用sed時寫一個循環?而你如何處理線*不包含任何網址? –

+0

@dystroy當然,我認爲sed是每個人都想使用的第一優先級,我只想說有另一種方式可以處理一般情況下沒有正則表達式,但無論如何,你是對的 – liltme