Shell:从HTML中提取一些代码

时间:2011-05-20 20:24:55

标签: bash shell command-line grep

我从HTML文件中获得以下代码段:

<div id="rwImages_hidden" style="display:none;">
    <img src="http://example.com/images/I/520z3AjKzHL._SL500_AA300_.jpg" style="display:none;"/>
    <img src="http://example.com/images/I/519z3AjKzHL._SL75_AA30_.jpg" style="display:none;"/>
    <img src="http://example.com/images/I/31F-sI61AyL._SL75_AA30_.jpg" style="display:none;"/>
    <img src="http://example.com/images/I/71k-DIrs-8L._AA30_.jpg" style="display:none;"/>
    <img src="http://example.com/images/I/61CCOS0NGyL._AA30_.jpg" style="display:none;"/>
</div>

我想提取代码

520z3AjKzHL
519z3AjKzHL
31F-sI61AyL
71k-DIrs-8L
61CCOS0NGyL

来自HTML。

请注意:必须使用<img src="" style="display:none;"/>,因为HTML文件中还有其他类似的网址,但我只是<img src="" style="display:none;"/>之间的网址。

我的代码是:

cat HTML | grep -Po '(?<img src="http://example.com/images/I/).*?(?=.jpg" style="display:none;"/>)'

似乎有些不对劲。

3 个答案:

答案 0 :(得分:2)

您可以使用positive look ahead / look behind:

解决此问题
cat HTML | grep -Po "(?<=<img src=\"http://example.com/images/I/).*?(?=\._.*.jpg\" style=\"display:none;\"/>)"

演示:


Regexp细分:

  • .*?不情愿地匹配所有角色
  • (?<=<img src=...ges/I/)前面有<img .../I/
  • (?=\._...ne;\"/>)._...ne;\"/>
  • 成功完成

答案 1 :(得分:0)

我假设您正在寻找一个启动的后备,这就是抛出错误。

(?<=foo)不是(?<foo)

这给出了您指定的结果案例,但我不知道您是否需要直到JPG:

cat HTML | grep -Po '(?<=img src="http://example.com/images/I/)[^.]*'

直到和排除JPG将是:

cat HTML | grep -Po '(?<=img src="http://example.com/images/I/).*(?=.jpg)'

答案 2 :(得分:0)

如果你认为gawk是一个有效的bash解决方案:

awk -F'[/|\._]' -v img='/<img src="" style="display:none;"\/>/' '/img/{print $7}' file