2017-02-03 12 views
2

Мое регулярное выражение было проверено (с помощью онлайн-шашек) и работает. Я пытаюсь получить http-ссылки из файла, но конкретно , за исключением http ссылок, заканчивающихся расширением изображения (jpg, gif), используя это;Почему эта команда grep не исключает изображения?

grep -Eo '(http|https|rtmp)://[a-zA-Z0-9:0-9./[email protected]&%|()[:blank:],;-]*' | grep -v '.(?:jpg|gif|png)' 

Это мой файл, на котором работает grep;

LONDON Remote server cluster 88: taken, https://www.wiredcontent/rashida_opener_background2.jpg 
http://www.8379f690ba57e0fdf8f944324a4453de67780/tsa.a3m 

BRUSSELS: Hosted MPLS cluster 
http://www.5b0e9bc72b989c87a9a70da7865dbb5b4aa9c086/tsa.a3m 

PARIS: Hosted atrium access, https://i.gadgets360cdn.com/large/dell_UP3218K_1483646315000.gif 
http://www.39415215319c9brt6b9c7d10238c19cc82e7f88b/tsa.a3m 

PRAGUE: Main Office access, 
http://www.e721f751ab0936706192cf15b4632889b38f131a/tsa.a3m 

Я хочу Grep вернуть это:

http://www.8379f690ba57e0fdf8f944324a4453de67780/tsa.a3m 
http://www.5b0e9bc72b989c87a9a70da7865dbb5b4aa9c086/tsa.a3m 
http://www.39415215319c9brt6b9c7d10238c19cc82e7f88b/tsa.a3m 
http://www.e721f751ab0936706192cf15b4632889b38f131a/tsa.a3m 

Спасибо заранее.

+0

UPDATE: Ответ на Vatsug ниже очень полезен и работает с файлом file.txt со ссылками, но если ссылки передаются из переменной внутри скрипта, мне пришлось сделать что-то вроде этого: 'link = $ (printf "% s \ n" "$ line" | grep -Eo '(http | https): // [a-zA-Z0-9: 0-9 ./[email protected]&% |() [: blank:],; -] * '| grep -vP (http | https | rtmp): // [a-zA-Z0-9: 0-9 ./[email protected]&% |() [ : blank:],;] * (jpg | png | gif) ') ' – manners

ответ

2

Добавление -P флага для расширения Perl во втором grep вызова работал для меня:

echo "$input" | grep -Eo '(http|https|rtmp)://[a-zA-Z0-9:0-9./[email protected]&%|()[:blank:],;-]*' | grep -vP '.(?:jpg|gif|png)' 

Это требует, чтобы ваш grep поддерживает Perl-расширение.

+0

Хорошо, с примером input.txt ваше решение работает, спасибо за это, но у меня другая проблема, я должен был объяснить, m в значении grep для работы следующим образом: 'LINK = echo" $ line "| grep -Eo '(http | https | rtmp): // [a-zA-Z0-9: 0-9 ./[email protected]&% |() [: blank:],;] *' | grep -vP '. (?: jpg | gif | png)' ' и, к сожалению, ваше решение не помогло в этом обстоятельстве. – manners

+0

Я отредактировал свой ответ, помогает ли это? – vatsug

+0

К сожалению, нет - я думаю, что моя переменная $ line на самом деле является строкой, которая поступает из команды непосредственно перед моей командой grep; '| при чтении строки; do' Я думаю, что ваше решение работает, потому что grep работает над целым текстовым файлом, и мой grep работает в скрипте bash в одной строке из исходного файла - надеюсь, у меня есть смысл! – manners