Еще один жадный вопрос - PullRequest
0 голосов
/ 14 ноября 2010

Я делаю автоматическую загрузку нескольких изображений с использованием источника кадров 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

Но есть одна неприятная линия. Эта строка, obvioulsy, является ошибкой на сайте, или чем-то еще, но это неправильно, я не могу изменить это, однако. ;)

<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

Вы понимаете, почему. Сед жадный, и в этом случае это очевидно.

Теперь вопрос, как мне избавиться от этого углового корпуса? То есть, сделайте его нежадным и остановите его на ПЕРВОМ .jpg? выделенный текст

Ответы [ 5 ]

2 голосов
/ 14 ноября 2010

используйте perl:

perl -pe 's/^.*htm?\(.*?jpg\).*$/\1/'
1 голос
/ 14 ноября 2010

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

1 голос
/ 14 ноября 2010

Используйте [^ "] вместо. В регулярном выражении. Это выберет все символы, кроме апострофов.

1 голос
/ 14 ноября 2010

Вы можете рассмотреть возможность изменения:

\(.*jpg\)

на:

\([^"]*jpg\)

Это должно остановить ваш первоначальный поиск, выходящий за пределы конца первого href.Представит ли это другие проблемы (для других крайних случаев), сказать немного сложно, учитывая, что я не знаю полный набор входных данных.

Если это так, вы можете выбрать использование реального парсераа не регулярные выраженияРегулярные выражения являются мощным инструментом, но они не обязательно подходят для всего.

0 голосов
/ 15 ноября 2010

GNU grep может сделать PCRE:

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