1

我想得到带有扩展名的字符串.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"'
4

2 回答 2

2

你的 ftp 路径需要一个斜杠(否则你没有输出),你应该使用--list-onlyswitch 来curl让你的生活更轻松:

-l, --list-only

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

最重要的是,由于您正在使用 连接ftp,因此您的输出中也不会有任何hrefs - 只是您可以轻松访问的所述目录的文件名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
于 2013-08-30T09:38:58.460 回答
0

目前尚不清楚为什么您认为您的正则表达式会匹配。试试这个。

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

在正则表达式中,[^a]指定“除 , 之外的任何字符a,并且*是指定“前一个表达式重复零次或多次”的后缀运算符。

因此[^"]*匹配任意长度的子字符串,其中包含非". 并且您尝试的正则表达式指定href=rdf/un(使用多余的反斜杠来转义/不需要转义的),然后是 0 次或多次重复i,然后是.rd,然后是 0 次或多次重复f,然后是.gz.

还要注意变量 interpolation 周围的双引号"$site"。在 shell 脚本中,您通常希望允许变量包含 shell 元字符,并将它们插入双引号中,除非您特别希望 shell 对这些元字符进行操作。

如果您只想提取双引号内的匹配表达式,请尝试sed

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

href=如果一行上有很多匹配项,这只会找到第一个。如果这是一个问题,也许您应该使用适当的 HTML 解析器来进行 HTML 操作。

于 2013-08-30T09:34:12.823 回答