Webページのスクリプトによって自動的に生成されるhtmlファイルをダウンロードしました。ファイルに画像リンクを含む複数のリンクが含まれています。画像のフルネームを抽出しようとしています。
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
上から"Image name.jpg"
ファイルに保存したいです。そのような名前は何百ものあるため、ファイルを解析し、次のコマンドを使用して表示されるように各名前を保存します。
grep -i -E -o "target=\"_blank\">([[:graph:]]*)\.(jpg|png|gif|webm)" "$thread" | cut -f 2 -d '>' | sed 's/ /_/g' - > "$names"
ここで、 " $thread
"はhtmlファイルの名前、 " $names
"は出力されるファイル名のリストです。 " "を使用してその部分を削除cut
し、'target="_blank">'
スペースをアンダースコアに変換します。
ファイルに異なるリンクが複数あるため、クロールする拡張子(imageとwebm)を指定しました。他のすべては無視する必要があります。これらのリンクだけがクロールされましたが、一部のリンクが欠落しているポイントに達しました。
一部のファイルには、スペースと英数字以外の文字が含まれています。これらすべてのケースをカバーする必要があるwhichを使用すると、何も得られないか、html部分[[:print:]]
だけが得られ、他のものは何も得られません。<head>
使用すると[[:graph:][:space:]]
何も得られません。[[:graph:]]
上記のように使用したり、[[:alnum:][:punct:]]
英数字/その他の文字( "")を含むfilenamewith(parenthesis).jpg
ファイルをインポートしたりできますが、空白は含まれていないか、その逆の場合は[[:alnum:][:space:]]
機能しますが、印刷可能な他の文字を無視します( " file name with spaces.jpg
"は機能しますが "一緒に"は使用しません)(括弧、カンマ、またはその他.jpg")。
すべての場合を包括するというのです[[:print:]]
が、私が正しく理解したら必要なものを得られません。
grep -E -o
(上記に基づいて)一致する必要があります:
*.jpg *.png *.gif
または*.webm
grep
私は持っているかどうか、-E/-o/-e
さまざまなバリエーションを試しました。
どんなアイデアがありますか?私はArch Linux、grep 2.20、bash 4.3.18を使用しています。
ベストアンサー1
最良の戦略は、<a>
すべてのタグの値を出力できる適切なHTMLパーサーを使用することです。
これはxmlstarlet
特にXMLパーサーです。 HTMLは正しい形式のXMLではないかもしれませんが、おそらく次のアイデアを得ることができます。
echo '<html>
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
</html>' | xmlstarlet sel -t -v //a
Image name.jpg