Me gustaría que bash analice / extraiga una URL completa (y solo la URL) de una cadena corta aleatoria.
Ejemplos:
bob, the address is http://www.google.com
o
https://foo.com/category/example.html is up
o
Error 123 occurred at http://bit.ly/~1223456677878
o
Stats are up: https://foo1234.net/report.jpg
Traté de usar cat foo_output | egrep -o "https?://[\w'-\.]*\s"
pero eso no pareció funcionar.
bash
scripting
regular-expression
Mike B
fuente
fuente
Respuestas:
Has probado:
¿en lugar?
Tenga en cuenta que cualquier cosa con una clase de caracteres se toma como literal, por lo que decir
[\w]
no coincide con un carácter de palabra . Además, no necesita escapar de un metacarácter regex dentro de una clase de caracteres, es decir, decir[\.]
que no es lo mismo que[.]
.fuente
[^ ]
es demasiado amplia, tendrá que excluir otros espacios en blanco,(
,)
,, posiblemente, comas, y todos los caracteres que no están permitidos en las direcciones URL.Los URI no son adecuados para la coincidencia de expresiones regulares cuando se incrustan en lenguaje natural. Sin embargo, el estado actual de la técnica es el patrón de expresiones regulares precisas y liberales de John Gruber para las URL coincidentes . Como se publica actualmente, la versión de una línea es la siguiente:
John también parece mantener una esencia aquí , aunque su entrada en el blog hace un trabajo mucho mejor al explicar su corpus de prueba y las limitaciones del patrón de expresión regular.
Si desea implementar la expresión desde la línea de comando, puede verse limitado por el motor de expresión regular que está utilizando o por problemas de comillas. He encontrado que un script de Ruby es la mejor opción, pero su kilometraje puede variar.
fuente
El problema con las URL coincidentes es que casi cualquier cosa puede estar en una URL:
Como se puede ver, el (válido) URL anterior contiene
$
,?
,#
,&
,,
,.
y:
. Básicamente, lo único de lo que puede estar seguro es que una URL no contiene es un espacio en blanco. Con eso en mente, puede extraer sus URL con un patrón tan simple como:El
\S
coincide con cualquier no espaciales caracteres en Perl expresiones regulares compatibles (PCREs), la-P
activa PCREs paragrep
y la-o
hace imprimir sólo el segmento de emparejado de la línea.fuente
Iría por encadenar pero un poco diferente. Si tiene un fragmento de texto como el suyo en un archivo de texto llamado strings.txt, puede hacer lo siguiente:
Explicación:
Como existe la posibilidad de que la url no funcione, puede realizar una comprobación adicional de errores con su URL de interés. por ejemplo
wget -p URL -O /dev/null
, imprimirá códigos de error bastante diferentes en caso de que la URL no esté disponible, por lo que podría configurar un bucle para procesar su lista de enlaces y generar su estado de validez.Si finalmente está extrayendo enlaces de archivos html, puede haber algunos problemas
sed
en casos especiales. Como se ha sugerido en una divertida (publicación) que probablemente ya haya visto, puede ser mejor no usar expresiones regulares sino un motor de análisis html. Uno de estos analizadores fácilmente disponibles es el navegador de solo textolynx
(disponible en cualquier Linux). Esto le permite volcar instantáneamente la lista de todos los enlaces en un archivo y luego simplemente extraer las URL que desee con grep.Sin embargo, esto no funcionará en la mayoría de los archivos html maltratados o fragmentos de texto con enlaces.
fuente
Sólo
egrep -o 'https?://[^ ")]+'
que incluirá
url()
y "http"fuente
egrep
está en desuso.como alternativa, agregue el comando SED para almacenarlo en el archivo CSV:
fuente