LINUX.ORG.RU

Как пользоваться регулярками в грепе вообще?

 ,


1

2

Есть большой html файл, нужно оттуда выдрать ссылки, оканчивающиеся на «none», например. Пробую grep -P -o "http:\/\/.+?;none" index.html, однако захватывает очень много, видимо от первого «http» в файле и до последнего «none» (жадный режим?), несмотря на ".+?" (без знака вопроса такая же фигня). Ключ -w не помогает (вообще ничего не выводит).

Пробовал pcregrep, такая же фигня. Думаю написать свой grep на питоне…

Покажи пример входных данных

zolden ★★★★★ ()

Так, к размышлению.

iMac-xtraeft:~ xtra$ curl 'https://www.linux.org.ru/forum/general/10732801?lastmod=1407087721584' -s |grep -Pow 'http:\/\/.+?'
http://www
http://www
http://www
http://schema
http://juick
http://schema
http://www
iMac-xtraeft:~ xtra$ curl 'https://www.linux.org.ru/forum/general/10732801?lastmod=1407087721584' -s |grep -Po 'http:\/\/.+?'
http://w
http://w
http://w
http://s
http://j
http://s
http://w

xtraeft ★★☆☆ ()

видимо от первого «http» в файле и до последнего «none»'

Да ну, скорее от первого до первого. Только первый http-то может и не оканчиваться на none.

гк кругом: -P - экспериментальный вроде, \/ -> /, вместо . лучше [^«>] (да и по возможности лучше не регулярками).

anonymous ()

Сделай замену http -> \nhttp и none -> none\n, а потом делай выборку.

kostik87 ★★★★★ ()

У тебя же там <a href="http://....none"> т.е. " тоже присутствуют

grep -P -o '"http:\/\/[^"]*;none"' index.html | tr -d '"'
sdio ★★★★★ ()
Последнее исправление: sdio (всего исправлений: 1)

У тебя ошибка в регулярке. Оно захватывает каждую ссылку (даже если она без ";none"), но останавливается только когда найдет ";none". А это может быть две и более ссылок с промежуточным текстом.

Дай пример ссылки, которую ты хочешь отловить.

Kroz ★★★★★ ()
Ответ на: комментарий от unanimous

Хм, что именно это изменит в данном случае?
Гарантирует отсутствие подстановок со стороны шелла.

А какой шелл что-нибудь подставит? Просто изначальное «а потом греши на grep» подразумеват _конкретный_ косяк в экранировании.

anonymous ()

Ну, или вот:

$ cat delme.txt 
text
http://somelink1;none
text http://somelink2;none http://anotherlink3;none bla
text http://somelink4_bad http://anotherlink5;none bla http://anotherlink6;none bla
nothing
nothing
text http://somelink7;none http://anotherlink8;none bla http://anotherlink9;none bla

$ cat delme.txt | grep -P -o 'http:\/\/.+?(;none|(?=http:\/\/))' | grep ';none'
http://somelink1;none
http://somelink2;none
http://anotherlink3;none
http://anotherlink5;none
http://anotherlink6;none
http://somelink7;none
http://anotherlink8;none
http://anotherlink9;none
На правах угадывания что тебе нужно.

Но лучше чтобы ты выдал пример ссылки, которую тебе нужно отловить. А еще лучше - с куском исходного текста.

Kroz ★★★★★ ()

Так сработало как надо: grep -P -o 'http:\/\/\S+?all' (без ? тоже работает).

Gicdillax ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.