0

我正在使用 html 框架源自动下载许多图像。太棒了,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

但是有一条讨厌的线。那条线,很明显,是网站中的一个错误,或者任何可能的错误,但它是错误的,但是我无法更改它。;)

<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_Frgate16.jpg ”排成一行。我的剧本给了我

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

在正则表达式中使用 [^"] 而不是 .。这将选择除撇号以外的所有字符。

于 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 回答