¿Cómo imprimir líneas usando find y sed en varios archivos?

¿Cómo imprimir líneas usando find y sed en varios archivos?

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 findpieza funciona bien, la xargsuna, está bien, pero la sedotra, no. Todo lo que obtengo en urls.txt es la concatenación de todos los archivos.

Respuesta1

Usando el mismo findcomando, 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 -oopción greple indica que devuelva solo la parte coincidente, no la línea en la que se encuentra la coincidencia. -hle indica que omita la impresión de los nombres de los archivos en los que se encontraron las coincidencias.

El findcomando 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 findcomando que busca todos .htmllos 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 htmlarchivos malos, cas sugiere dejar espacios en blanco o >también señalar el final de una URL y también httpsaceptar 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

información relacionada