У меня есть следующий фрагмент кода из файла 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-файле есть другие похожие URL-адреса, но я могу указать только те, которые находятся между <img src="" style="display:none;"/>.
<img src="" style="display:none;"/>
Мой код:
cat HTML | grep -Po '(?<img src="http://example.com/images/I/).*?(?=.jpg" style="display:none;"/>)'
Кажется, что-то не так.
Вы можете решить эту проблему, используя позитивный взгляд вперед / взгляд позади:
cat HTML | grep -Po "(?<=<img src=\"http://example.com/images/I/).*?(?=\._.*.jpg\" style=\"display:none;\"/>)"
Демонстрация:
Распределение регулярных выражений:
.*?
(?<=<img src=...ges/I/)
<img .../I/
(?=\._...ne;\"/>)
._...ne;\"/>
И если вы считаете gawk допустимым решением bash:
awk -F'[/|\._]' -v img='/<img src="" style="display:none;"\/>/' '/img/{print $7}' file
Я полагаю, вы искали средство для запуска, которое выдает ошибку.
(?<=foo) не (?<foo).
(?<=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)'