2013-08-30 22 views
1

我想獲得字符串與extenions .rdf.gz,例如, uniprot.rdf.gzuniref.rdf.gz從curl的ftp輸出grep下面的模式

我嘗試:

grep 'href="rdf\/uni*\.rdf*\.gz"' 

,但我無法得到任何東西。

$ echo $site 
ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/rdf 
$ curl -s $site | grep 'href="rdf\/uni*\.rdf*\.gz"' 

回答

0

現在還不清楚爲什麼你認爲你的正則表達式會匹配。試試這個。

curl -s "$site" | grep 'href="rdf/uni[^"]*\.rdf\.gz"' 

在常規表達式,[^a]指定「的任何字符以外a,和*的後綴操作符指定‘先前表達重複零次或多次’。

所以[^"]*的任何一個子串匹配長度包含不是"的字符,並且您嘗試的正則表達式指定爲href=rdf/un(帶有冗餘反斜槓以逃避/,這不需要轉義),然後是零個或多個重複的i,然後是.rd ,然後是零個或多個重複的f,然後是.gz

還要注意圍繞可變插值的雙引號"$site"。在shell腳本中,通常希望允許變量包含shell元字符,並將它們插入到雙引號中,除非您特別希望shell對這些元字符執行操作。

如果您想提取雙引號內的匹配表達式,請嘗試使用sed

curl -s "$site" | sed -n 's%.*href="rdf/uni\([^"]*\.rdf.gz\)".*%\1%p' 

這將只會找到第一個href=如果一條線上有很多匹配。如果這是一個問題,也許你應該使用適當的HTML解析器來進行HTML處理。

+0

這可能是正確的,如果輸出是「預期」,但並沒有解決實際問題(curl'的'錯誤的使用加上完全錯誤的(和不必要的)正則表達式);-) –

+0

curl -s「$ site」| sed -n's%。* href =「rdf/uni \([^」] * \。rdf.gz \)「。*%\ 1%p'對我有用 –

1

您的FTP路徑需要一個結尾斜槓(否則你沒有輸出),你應該使用--list-only開關curl,將讓您的生活更輕鬆的方式:

-l,--list只

  (FTP) When listing an FTP directory, 
     this switch forces a name-only view. 

最重要的是,因爲使用的是ftp連接,不會有任何href在你的輸出或者 - 僅僅是文件名的目錄說,你可以很容易地grep上:

$ curl -s --list-only "ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/rdf/" | grep '\.rdf\.gz$' 
citations.rdf.gz 
databases.rdf.gz 
diseases.rdf.gz 
enzyme.rdf.gz 
go.rdf.gz 
journals.rdf.gz 
keywords.rdf.gz 
locations.rdf.gz 
pathways.rdf.gz 
taxonomy.rdf.gz 
tissues.rdf.gz 
uniparc.rdf.gz 
uniprot.rdf.gz 
uniref.rdf.gz 
+1

+1 Oooh,該網站是一個FTP服務器。 – tripleee