4

このWebサイトからすべての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'

しかし、私はこのエラーが発生しています:

sed: -e expression #1, char 40: invalid reference \1 on `s' command's RHS
4

1 に答える 1

4

regex解析することは避けますhtmlmojoliciousパーサーとして使用する代替手段があります。

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/ 
    })'

を主張する場合、正規表現にはいくつかの問題があります。まず、グループ化を行うために括弧をエスケープする必要があります。第二に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'

どちらのコマンドでも次の結果が得られます。

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-09-13T07:43:24.427 に答える