Tengo muchos archivos en una estructura de directorios. Quiero extraer alguna cadena (es decir, URL) mediante una expresión regular de esos archivos.
He probado esto:
find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt
... pero no funciona como se esperaba. La find
pieza funciona bien, la xargs
una, está bien, pero la sed
otra, no. Todo lo que obtengo en urls.txt es la concatenación de todos los archivos.
Respuesta1
Usando el mismo find
comando, esto devolverá las URL que coincidan con la expresión regular:
find . -path "*alder/ * / * .html" -exec grep -oh "http://[^'\"]*" {} +
A diferencia de find...-print | xargs command...
, este enfoque funcionará en archivos cuyos nombres contengan espacios en blanco u otros caracteres difíciles.
La -o
opción grep
le indica que devuelva solo la parte coincidente, no la línea en la que se encuentra la coincidencia. -h
le indica que omita la impresión de los nombres de los archivos en los que se encontraron las coincidencias.
El find
comando en el OP solo coincide con archivos cuyos nombres tienen espacios en la ruta. Como sospecho que esto no es lo que desea, aquí hay una forma alternativa del find
comando que busca todos .html
los archivos en cualquier profundidad en los subdirectorios del directorio actual cuyos nombres terminan en alder
:
find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +
Enfoque más sólido
Para protegerse contra otros tipos de html
archivos malos, cas sugiere dejar espacios en blanco o >
también señalar el final de una URL y también https
aceptar http
:
find . -path "*alder/ * / * .html" -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +
Respuesta2
Gracias por todas las respuestas rápidas. Perdón por los espacios adicionales en la ruta, pero eliminarlos convierte la ruta en algo extraño al intentar publicar aquí.
Quería usar sed para grep, que es realmente lento en más de 1,2 GB y 25.000 archivos.
He encontrado una respuesta. Un primer comando sed para cortar los archivos con "'= caracteres, y luego un segundo comando sed para imprimir las líneas. Aquí está:
encontrar . -ruta "*alder.com/ * / * .html" -imprimir| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt