0

htmlフレームソースを使用して、多数の画像の自動ダウンロードを行っています。So fra、so good、Sed、wget。フレームソースの例:

<td width="25%" align="center" valign="top"><a href="images/display.htm?concept_Core.jpg"><img border="1" src="t_core.gif" width="120" height="90"><font size="1" face="Verdana"><br>Hyperspace Core<br>(Rob Cunningham)</font></a></td>

だから私はこれを行います:

sed -n -e 's/^.*htm?\(.*jpg\).*$/\1/p' concept.htm

このような部分を取得するには:

concept_Core.jpg

次にこれを行うには:

wget --base = / some / url / concept_Core.jpg

しかし、厄介な線が1つあります。その行は、明らかに、サイトのバグ、またはそれが何であれ、それが間違っているので、変更することはできません。;)

<td width="25%" bla bla face="Verdana"><a href="images/display.htm?concept_frigate16.jpg" target="_top"><img bla bla href="images/concept_frigate16.jpg" target="_top"><br>Frigate 16<br>

つまり、これらの「concept_Frigate16.jpg」のうちの2つが1行に並んでいます。そして私のスクリプトは私に与えます

concept_frigate16.jpg" target="_top"><img border="1" src="t_assaultfrigate.gif" width="120" height="90" alt="The '16' in the name may be a Sierra typo."></a><a href="images/concept_frigate16.jpg

あなたはその理由を理解しています。Sedは貪欲で、この場合は明らかにこれが現れます。

さて、問題は、どうすればこのコーナーケースを取り除くことができるかということです。つまり、貪欲ではなく、最初の.jpgで停止しますか?強調されたテキスト

4

5 に答える 5

2

perlを使用する:

perl -pe 's/^.*htm?\(.*?jpg\).*$/\1/'
于 2010-11-14T20:22:24.330 に答える
1

変更を検討することをお勧めします。

\(.*jpg\)

の中へ:

\([^"]*jpg\)

これにより、最初の検索が最初の検索の終わりを超えて停止するはずhrefです。それが他の問題を引き起こすかどうか(他のエッジケースの場合)は、入力の完全なセットがわからないことを考えると、言うのは少し難しいです。

もしそうなら、正規表現ではなく実際のパーサーを使用することを選択することをお勧めします。正規表現は強力なツールですが、必ずしもすべてに適しているわけではありません

于 2010-11-14T20:22:44.767 に答える
1

正規表現で.の代わりに[^"]を使用します。これにより、appostrophesを除くすべての文字が選択されます。

于 2010-11-14T20:23:52.223 に答える
1

sed -n -e 's/^.*htm?\([^"]*jpg\).*$/\1/p'

于 2010-11-14T20:25:04.780 に答える
0

GNU grepはPCREを実行できます:

grep -Po '(?<=\.htm\?).*?jpg' concept.htm
于 2010-11-14T21:25:59.820 に答える