2015-06-05 4 views
0

я несколько легко с регулярным выражением, но не с Grep особенно, и не могу понять, почему следующее регулярное выражение возвращает ничего:Почему grep ничего не возвращает?

wget -qO- 'http://www.acme.com/index.html' | grep -iPo '(?s)(^<div class="titlebar">.+?<div class="colleft">)' 

Я предваряется потому что всеохватывающий»(s?). +?» включает возврат каретки (CRLF, CR или LF, в зависимости от того, как был сохранен текст).

Любая идея, почему она не работает должным образом?

спасибо.

+2

Поскольку ни одно из этих имен классов не появляется на странице, на которой 'wget' возвращается? Что такое '(? S)' делать? –

+0

Потому что он злой? –

+1

'(? S)' разрешает функцию, которая '.' может соответствовать новой строке. http://perldoc.perl.org/perlre.html - здесь не полезно, так как grep является ориентированным на линию инструментом. –

ответ

0

grep ориентирован на линию, поэтому, если между тегами есть новые строки, grep не может найти его. Вы хотите:

wget -qO- 'http://website.invalid/index.html' | 
perl -0777 -nE 'say for /(^<div class="titlebar">.+?<div class="colleft">)/msg' 
+0

Спасибо. Чтобы избежать установки Perl (устройство с небольшой памятью), я попробовал pcregrep, но он ничего не возвращает: pcregrep -M " (. +)" input.html – Gulbahar

+0

Какие у вас есть инструменты? sed/awk/...? –

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