Простая проблема Grep Mismatch - PullRequest
1 голос
/ 11 июля 2011

Я использую Ubuntu 10.10 и использую Grep для обработки некоторых файлов HTML.

Вот фрагмент кода HTML:

<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">

Я хотел бы извлечь one-hd.mov и another-hd.mov, но игнорировать normal.mov.

Вот мой код:

example='<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">'
echo $example | grep -Po '(?<=video.php\?video=).*?(?=-hd.mov">)'

Результат:

one
normal.mov"><img src="/2.jpg"><a href="video.php?video=another

Но я хочу

one
another

Там есть несоответствие.

Это из-за так называемого жадного регулярного выражения?

Я пою GREP, но любые инструменты командной строки bash могут решить эту проблему, такие как sed и т. Д.

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 11 июля 2011

Вы хотите использовать регулярные выражения Perl для grep - почему бы не использовать perl?

echo "$example" | perl -nle 'm/.*?video.php\?video=([^"]+)">.*video.php\?video=([^"]+)".*/; print "=$1=$2="'

напечатает

=one-hd.mov=another-hd.mov=
1 голос
/ 11 июля 2011

Решение с использованием awk:

{
    for(i=1;i<NF;i++) {
        if ($i ~ /mov/) {
            if ($i !~ /normal/){
                sub(/^.*=/, "", $i)
                print $i
            }
        }
    }
}

выходы:

$ awk -F'"' -f h.awk html
one-hd.mov
another-hd.mov

Но я настоятельно советую использовать вместо этого html-парсер, что-то вроде BeautifulSoup

1 голос
/ 11 июля 2011

Вот решение с использованием xmlstarlet:

$ example='<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">'
$ echo $example | xmlstarlet fo -R 2>/dev/null | xmlstarlet sel -t -m "//*[substring(@href, string-length(@href) - 6, 7) = '-hd.mov']" -v 'substring(@href,17, string-length(@href) - 17 - 3)' -n
one-hd
another-hd

$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...