Como eu posso extrair / analisar uma URL completa de uma string semi aleatória?

7

Eu gostaria de ter o bash parse / extrair um URL completo (e apenas o url) de uma string curta aleatória.

Exemplos:

bob, the address is http://www.google.com

ou

https://foo.com/category/example.html is up

ou

Error 123 occurred at http://bit.ly/~1223456677878

ou

Stats are up: https://foo1234.net/report.jpg

Eu tentei usar cat foo_output | egrep -o "https?://[\w'-\.]*\s" , mas isso não funcionou.

    
por Mike B 04.03.2014 / 07:25

6 respostas

18

Você tentou:

egrep -o 'https?://[^ ]+' foo_output

em vez disso?

Observe que qualquer coisa com uma classe de caracteres é considerada literal, portanto, dizer [\w] não corresponde a caractere de palavra . Além disso, você não precisa escapar de um meta-caractere de regex dentro de uma classe de caracteres, ou seja, dizer que [\.] não é o mesmo que [.] .

    
por 04.03.2014 / 07:45
5

Os URIs não são adequados para correspondência de expressão regular quando incorporados em linguagem natural. No entanto, o atual estado da arte é o Improved Liberal, Preciso Padrão de Regex para URLs correspondentes de John Gruber. Conforme publicado atualmente, a versão de uma linha é a seguinte:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s'!()\[\]{};:'".,<>?«»“”‘’]))

John também parece manter uma idéia aqui , embora seu blog faça um trabalho muito melhor de explicar seu corpo de teste e as limitações do padrão de expressão regular.

Se você quiser implementar a expressão a partir da linha de comando, poderá ficar limitado pelo mecanismo de expressões regulares que está usando ou por problemas de citação de shell. Eu encontrei um script Ruby para ser a melhor opção, mas sua milhagem pode variar.

    
por 04.03.2014 / 15:55
1

O problema com URLs correspondentes é que praticamente qualquer coisa pode estar em um URL:

https://encrypted.google.com/search?hl=en&q=foo#hl=en&q=foo&tbs=qdr:w,sbd:1

Como você pode ver, o URL (válido) acima contém $ , ? , # , & , , , . e : . Basicamente, a única coisa que você pode ter certeza de que um URL não contém é um espaço em branco. Com isso em mente, você pode extrair seus URLs com um padrão tão simples quanto:

$ grep -oP 'http.?://\S+' file 
http://www.google.com
https://foo.com/category/example.html
http://bit.ly/~1223456677878
https://foo1234.net/report.jpg

O \S corresponde a quaisquer caracteres sem espaço em expressões regulares compatíveis perl (PCREs), a -P ativa os PCREs para grep e o -o faz com que ele imprima apenas o segmento correspondente da linha.

    
por 04.03.2014 / 18:07
0

Eu gostaria de encadear, mas um pouco diferente. Se você tem um trecho de texto como o seu em um arquivo de texto chamado strings.txt, você pode fazer o seguinte:

grep http ./strings.txt | sed 's/http/\nhttp/g' | grep ^http | sed 's/\(^http[^ <]*\)\(.*\)//g' | grep IWANTthis | sort -u

Explicação:

grep http ./st3.txt      => will catch lines with http from text file
sed 's/http/\nhttp/g'    => will insert newline before each http
grep ^http               => will take only lines starting with http
sed 's/\(^http[^ <]*\)\(.*\)//g'   
                         => will preserve string from ^http until first space or < (the latter in hope if 
grep IWANTthis           => will take only urls containing your text of your interest; you can omit this.
sort -u                  => will sort the list and remove duplicates from it 

Como há uma chance de o URL não funcionar, você pode fazer uma verificação de erros adicional com seu URL de interesse. por exemplo. wget -p URL -O /dev/null - imprimirá códigos de erro bastante diferentes caso a URL não esteja disponível, portanto você pode configurar um loop para processar sua lista de links e gerar seu status de validade.

Se você estiver extraindo links de arquivos html, pode haver algum problema com sed em casos especiais. Como foi sugerido em um ) que você provavelmente já viu - pode ser melhor não usar regexps, mas um mecanismo de análise de html. Um analisador tão facilmente disponível é o texto apenas navegador lynx (disponível em qualquer linux). Isso permite que você esvazie instantaneamente a lista de todos os links em um arquivo e, em seguida, apenas extraia os URLs desejados com o grep.

lynx -dump -listonly myhtmlfile.html | grep IWANTthisString | sort -u

No entanto, isso não funcionará na maioria dos arquivos HTML ou trechos de texto com links.

    
por 28.02.2017 / 18:19
-1

Apenas egrep -o 'https?://[^ ")]+'

que incluirá url() e "http"

    
por 26.04.2016 / 22:11
-1
cat text-file.txt | grep -Eo '(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'

alternativamente, adicione o comando SED para armazená-lo no arquivo CSV:

| sed 's/;/<tab>/g' > file.csv
    
por 28.02.2017 / 17:24