Eu gostaria que o bash analisasse / extraísse um URL completo (e apenas o URL) de uma sequência 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 parecia funcionar.
bash
scripting
regular-expression
Mike B
fonte
fonte
Respostas:
Você tentou:
em vez de?
Observe que qualquer coisa com uma classe de caractere é tomada como literal, portanto, dizer
[\w]
não corresponde a um caractere de palavra . Além disso, você não precisa escapar de um metacaractere regex dentro de uma classe de personagem, ou seja, dizer[\.]
não é exatamente o mesmo que[.]
.fonte
[^ ]
é muito grande, você vai querer excluir outros espaços em branco,(
,)
,, possivelmente, comas, e todos os caracteres que não são permitidos em URLs.Os URIs não são adequados para correspondência de expressão regular quando incorporados em linguagem natural. No entanto, o estado da técnica atual é o Liberal Melhorado, Padrão Regex Preciso de John Gruber para URLs Correspondentes . Conforme publicado atualmente, a versão de uma linha é a seguinte:
John também parece manter uma essência aqui , embora sua entrada no blog faça um trabalho muito melhor ao explicar seu corpus de teste e as limitações do padrão de expressão regular.
Se você deseja implementar a expressão na linha de comando, pode se sentir limitado pelo mecanismo de expressão regular que está usando ou por problemas de citação de shell. Eu achei o script Ruby a melhor opção, mas sua milhagem pode variar.
fonte
O problema com os URLs correspondentes é que praticamente qualquer coisa pode estar em um URL:
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:Ele
\S
corresponde a qualquer caractere que não seja espaço em expressões regulares compatíveis com perl (PCREs),-P
ativa PCREsgrep
e-o
faz com que ele imprima apenas o segmento correspondente da linha.fonte
Eu iria encadear, mas um pouco diferente. Se você tiver um snippet de texto como o seu em um arquivo de texto chamado strings.txt, poderá fazer o seguinte:
Explicação:
Como existe a possibilidade de o URL não funcionar, você pode fazer uma verificação de erro adicional com seu URL de interesse. por exemplo
wget -p URL -O /dev/null
- ele imprimirá códigos de erro bastante diferentes, caso a URL não esteja disponível, para que você possa configurar um loop para processar sua lista de links e gerar seu status de validade.Se você estiver finalmente extraindo links de arquivos html, poderá haver alguns problemas
sed
em casos especiais. Como foi sugerido em uma postagem engraçada que você provavelmente já viu - talvez seja melhor não usar regexps, mas um mecanismo de analisador de html. Um desses analisadores facilmente disponíveis é o navegador somente de textolynx
(disponível em qualquer linux). Isso permite que você despeje instantaneamente a lista de todos os links em um arquivo e extraia os URLs desejados com o grep.No entanto, isso não funcionará na maioria dos arquivos html mutilados ou trechos de texto com links.
fonte
Somente
egrep -o 'https?://[^ ")]+'
que incluirá
url()
e "http"fonte
egrep
está obsoleto.adicione o comando SED como alternativa para armazená-lo no arquivo CSV:
fonte