2017-02-03 4 views
2

Meine Regex wurde getestet (mit Online-Checkern) und funktioniert. Ich versuche, HTTP-Links aus einer Datei, aber speziell exklusive http Links mit einer Bild-Erweiterung (JPG, GIF) mit dieser;Warum schließt dieser Befehl grep Bilder nicht aus?

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

Dies ist meine Datei, an der grep arbeitet;

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 

Ich möchte grep diese zurück:

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

Vielen Dank im Voraus.

+0

UPDATE: Vatsug Antwort unten ist sehr hilfreich und funktioniert mit einer Datei.txt mit den Links in, aber wenn die Links von einer Variablen innerhalb eines Skripts geleitet werden, habe ich etwas wie folgt zu tun: 'Link = $ (printf "% s \ n" "$ zeile" | grep -Eo '(http | https): // [a-zA-Z0-9: 0-9 ./[email protected]&% |() [: leer:],; -] * '| grep -vP' (http | https | rtmp): // [a-zA-Z0-9: 0-9 ./[email protected]&% |()] : blank:],; -] * (jpg | png | gif) ') ' – manners

Antwort

2

die -P Flagge für Perl-Erweiterung in der zweiten grep Anruf Hinzufügen arbeitete für mich:

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

Dies erfordert, dass Ihr grep die Perl-Erweiterung unterstützt.

+0

Ok, mit Beispiel input.txt funktioniert deine Lösung, danke dafür aber ich habe ein anderes Thema, ich hätte erklären sollen, dass ich' m Piping im Wert für grep, um so zu arbeiten: 'LINK = echo" $ line "| grep -Eo '(http | https | rtmp): // [a-zA-Z0-9: 0-9 ./[email protected]&% |() [: leer:],; -] *' | grep -vP '. (?: jpg | gif | png)' ' und leider hat Ihre Lösung unter diesen Umständen nicht funktioniert. – manners

+0

Ich habe meine Antwort bearbeitet, hilft das? – vatsug

+0

Leider nicht - ich denke es ist, weil meine $ line-Variable tatsächlich eine Zeile ist, die von dem Befehl direkt vor meinem grep-Befehl weitergeleitet wird; '| während Lesezeile; Ich denke, deine Lösung funktioniert, weil der Grep an einer ganzen Textdatei arbeitet und mein Grep innerhalb eines Bash-Skripts in einer einzigen Zeile von der Originaldatei arbeitet - ich hoffe, ich mache Sinn! – manners