我正在尝试列出该网站上的所有 gz 文件
site=http://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/rdf/
curl -s "$site" --list-only | sed -n 's%.*href="rdf/uni([^"]*\.rdf.gz)".*%\1%p'
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
sed: -e expression #1, char 40: invalid reference \1 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)
我会避免regex解析html. 这里你有一个使用perl和mojolicious解析器的替代方案:
perl -Mojo -E '
g(q|http://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/rdf/|)
->dom
->find(q|a|)
->each(sub {
my $t = $_->text;
say $t if $t =~ m/rdf\.gz\Z/
})'
Run Code Online (Sandbox Code Playgroud)
但如果您坚持使用sed,您的正则表达式就会出现一些问题。首先,必须转义括号才能进行分组。二rdf/uni是不匹配。第三,当你[^"]*这样做时,就会绕过扩展rdf.gz。将其更改为查找 a .,然后检查扩展名,但我记得那是非常脆弱的。它可能会以多种方式失败,例如.名称中带有 a 的文件:
curl -s "$site" --list-only | sed -n 's%.*href="\([^.]*\.rdf\.gz\)".*%\n\1%; ta; b; :a; s%.*\n%%; p'
Run Code Online (Sandbox Code Playgroud)
两个命令都会产生:
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
Run Code Online (Sandbox Code Playgroud)