我从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;"/>)'
似乎有些不对劲。
答案 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