代码之家  ›  专栏  ›  技术社区  ›  iksemyonov

又一个贪婪的问题

  •  0
  • iksemyonov  · 技术社区  · 14 年前

    我正在使用一个html帧源自动下载一些图像。好的,好的,赛德,好的。帧源示例:

    <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

    但有一条讨厌的线。很明显,这行代码是站点中的一个bug,或者是任何可能的bug,但是它是错误的,但是我不能更改它。;)

    <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_护卫舰16.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 回复  |  直到 14 年前
        1
  •  1
  •   paxdiablo    14 年前

    您可能需要考虑更改:

    \(.*jpg\)
    

    进入:

    \([^"]*jpg\)
    

    这应该会阻止你在第一次搜索结束后的第一次搜索 href . 考虑到我不知道完整的输入集,这是否会引入其他问题(对于其他边缘情况)有点难说。

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

        2
  •  2
  •   ennuikiller    14 年前

    使用perl:

    perl -pe 's/^.*htm?\(.*?jpg\).*$/\1/'
    
        3
  •  1
  •   kovarex    14 年前

    使用“^”]而不是。在正则表达式中。 这将选择除appostrophes之外的所有字符。

        4
  •  1
  •   khachik    14 年前

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

        5
  •  0
  •   Dennis Williamson    14 年前

    GNU grep可以做PCRE:

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