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