J'aimerais avoir bash parse / extract une URL complète (et seulement l'url) à partir d'une courte chaîne aléatoire.
Exemples:
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
J'ai essayé d'utiliser cat foo_output | egrep -o "https?://[\w'-\.]*\s"
mais cela ne semblait pas fonctionner.
bash
scripting
regular-expression
Mike B
la source
la source
Réponses:
As-tu essayé:
au lieu?
Notez que tout ce qui a une classe de caractère est considéré comme littéral, donc dire
[\w]
ne correspond pas à un mot . De plus, vous n'avez pas besoin d'échapper à un métacaractère regex dans une classe de personnage, c'est-à-dire que dire[\.]
n'est pas tout à fait la même chose que[.]
.la source
[^ ]
est trop large, vous aurez envie d'exclure d' autres blancs,(
,)
, peut - être comas, et tous les caractères qui ne sont pas autorisés dans les URL.Les URI ne sont pas bien adaptés à la correspondance des expressions régulières lorsqu'ils sont intégrés dans le langage naturel. Cependant, l'état actuel de la technique est le modèle Regex amélioré et libéral amélioré de John Gruber pour la correspondance des URL . Telle qu'elle est actuellement publiée, la version à une ligne est la suivante:
John semble également garder un sens ici , bien que son article de blog explique beaucoup mieux son corpus de test et les limites du modèle d'expression régulière.
Si vous souhaitez implémenter l'expression à partir de la ligne de commande, vous pouvez vous retrouver limité par le moteur d'expressions régulières que vous utilisez ou par des problèmes de citation du shell. J'ai trouvé un script Ruby comme la meilleure option, mais votre kilométrage peut varier.
la source
Le problème avec les URL correspondantes est que presque tout peut être dans une URL:
Comme vous pouvez le voir, l'URL (valide) ci - dessus contient
$
,?
,#
,&
,,
,.
et:
. Fondamentalement, la seule chose que vous pouvez être sûr qu'une URL ne contient pas est un espace vide. Dans cet esprit, vous pouvez extraire vos URL avec un modèle aussi simple que:Le
\S
correspond à tous les caractères non-espace dans les expressions régulières compatibles perl (PCRE), le-P
active les PCREgrep
et le-o
fait imprimer uniquement le segment correspondant de la ligne.la source
J'irais pour le chaînage mais un peu différent. Si vous avez un extrait de texte comme le vôtre dans un fichier texte appelé strings.txt, vous pouvez procéder comme suit:
Explication:
Comme il est possible que l'URL ne fonctionne pas, vous pouvez effectuer une vérification d'erreur supplémentaire avec votre URL d'intérêt. par exemple
wget -p URL -O /dev/null
- il imprimera des codes d'erreur assez différents au cas où l'URL ne serait pas disponible, vous pouvez donc configurer une boucle pour traiter votre liste de liens et afficher leur état de validité.Si vous extrayez finalement des liens à partir de fichiers html, il peut y avoir des problèmes
sed
dans des cas spéciaux. Comme cela a été suggéré dans un (post) amusant que vous avez probablement déjà vu - il est préférable de ne pas utiliser d'expressions régulières mais un moteur d'analyse HTML. Un tel analyseur facilement disponible est le navigateur texte uniquementlynx
(disponible sur n'importe quel linux). Cela vous permet de vider instantanément la liste de tous les liens dans un fichier, puis d'extraire les URL que vous souhaitez avec grep.Cependant, cela ne fonctionnera pas sur la plupart des fichiers html ou des extraits de texte avec des liens.
la source
Juste
egrep -o 'https?://[^ ")]+'
qui comprendra
url()
et "http"la source
egrep
est déconseillée.ajoutez également la commande SED pour la stocker dans le fichier CSV:
la source