2013-10-01 2 views
7

Я пишу скрипт bash, который анализирует html-файл и Я хочу получить содержимое каждого из <tr>...</tr>. Так что моя команда выглядит следующим образом:Нежелательное сопоставление с использованием? с grep

$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>' 

Но мне кажется, что grep дает мне результат:

$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>' 

Как я могу сделать .* нежадным?

+2

Обязательно: [Вы не можете разобрать html с регулярными выражениями] (http://stackoverflow.com/a/1732454/7552) –

ответ

14

Если у вас есть GNU Grep вы можете использовать -P сделать матч, не жадный:

$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>' 

Опция -P позволяет Perl Compliant регулярных выражений (PCRE), которая необходима для нежадным согласования с ? как базовое регулярное выражение (BRE) и расширенное регулярное выражение (ERE) не поддерживают его.

Если вы используете -P вы можете также использовать look arounds, чтобы избежать печати метки в матче примерно так:

$ tr -d \\012 < price.html | grep -Po '(?<=<tr>).*?(?=</tr>)' 

Если у вас нет GNU grep и HTML хорошо сформировавшимися вы могли бы просто сделать:

$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>' 

Примечание: Приведенный выше пример не будет работать с вложенными тегами в <tr>.

+3

Последний пример (используя «[^ <] * «вряд ли будет работать, так как неизбежно будут теги« td »или« th »в пределах« tr ». –

+1

@glennjackman хорошая точка, я оставлю это в ответах, однако, как правило, может быть полезно для поиска. –

3

.*? является регулярным выражением Perl. Меняйте grep к

grep -oP '<tr>.*?</tr>' 
+1

Или, если он хочет только содержимое тега tr: 'grep -oP '(? <=). *? (? =)'' - используя look-arounds, чтобы опустить теги –

3

Try Perl-стиль-регулярное_выражение

$ grep -Po '<tr>.*?</tr>' input 
<tr>stuff</tr> 
<tr>more stuff</tr> 
4

Non-жадные соответствия не является частью расширенного синтаксиса регулярных выражений, поддерживаемых grep -E. Используйте вместо этого grep -P, если у вас есть это, или переключитесь на Perl/Python/Ruby/что у вас есть. (О, и pcregrep.)

Смежные вопросы