还有一个贪婪的问题

时间:2010-11-14 20:15:01

标签: regex sed greedy

我正在使用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_Frigate16.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? 强调文本

5 个答案:

答案 0 :(得分:2)

使用perl:

perl -pe 's/^.*htm?\(.*?jpg\).*$/\1/'

答案 1 :(得分:1)

您可能需要考虑更改:

\(.*jpg\)

成:

\([^"]*jpg\)

这应该会阻止您的初始搜索超出第一个href的结尾。鉴于我不知道全套输入,这是否会引入其他问题(对于其他边缘情况)有点难以说明。

如果是这样,您可能希望选择使用真正的解析器而不是正则表达式。正则表达式是一个强大的工具,但它们不一定适合所有内容。

答案 2 :(得分:1)

在正则表达式中使用[^“]代替。 这将选择除了近视之外的所有字符。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

GNU grep可以做PCRE:

grep -Po '(?<=\.htm\?).*?jpg' concept.htm