Как однострочить этот поиск? - PullRequest
1 голос
/ 09 января 2012

У меня очень длинная строка, где я хотел бы найти все ссылки, когда за ними следует class="filelink"

Ссылка может выглядеть следующим образом

<a href="https://example.com/@api/files/123/=2008.pdf" class="filelink"

Как этотакая проблема написана как Perl one-liner?

Обновление

Если я сделаю

echo '<a href="https://example.com/@api/files/123/=2008.pdf" class="filelink"' > test
perl -pe 's/href="(.*)" class="filelink"/\1/g' test

, тогда я получу

<a https://example.com/@api/files/123/=2008.pdf

где бы я ожидал

https://example.com/@api/files/123/=2008.pdf

Ответы [ 3 ]

10 голосов
/ 09 января 2012

Решение с надежным парсером HTML вместо регулярного выражения:

<input_long_line.html perl -MWeb::Query=wq -ne '
    wq($_)
    ->find("a.filelink")
    ->each(sub {
        printf "URL %s\t text %s\n", $_[1]->attr("href"), $_[1]->text
    })'

Я обернул его для удобства чтения, он отлично работает как однострочный.

3 голосов
/ 09 января 2012
perl -nE'say for m/<a\s+href="([^"]+)"\s+class="filelink"[^>]*>/g;'
2 голосов
/ 10 января 2012

Альтернативный подход с использованием HTML::TreeBuilder::XPath, который я считаю довольно хорошим:

M=HTML::TreeBuilder::XPath; \
perl -M$M -le 'print $_->attr("href") for ' \
           -e "$M->new_from_content(<STDIN>)->" \
           -e 'findnodes(q(//a[@class="filelink"]))' < input-file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...