grep 来自 curl 的 FTP 输出的以下模式



我想获取扩展名为.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"'

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

-l、 --仅列出

         (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

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

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

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

因此[^"]*匹配任何长度的子串,该子串包含非"的字符。您尝试的正则表达式指定了href=rdf/un(带有一个多余的反斜杠来转义/,不需要转义),然后是零次或多次重复的i,然后是.rd,然后是0次或多次反复的f,最后是.gz

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

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

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

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

最新更新