从curl的ftp输出中grep以下模式

时间:2013-08-30 09:06:29

标签: curl ftp grep

我希望获得扩展.rdf.gz的字符串,例如uniprot.rdf.gzuniref.rdf.gz

我的尝试:

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"'

2 个答案:

答案 0 :(得分:1)

你的ftp路径需要一个尾部斜杠(否则你没有输出),你应该使用--list-only切换到curl,这会让你的生活变得更轻松:

  

-l, - list-only

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

最重要的是,由于您使用ftp进行连接,因此输出中也不会有任何href - 只是您可以轻松地{{1}所述目录的文件名在...上:

grep

答案 1 :(得分: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操作。