Tengo una serie muy larga de URL sin caracteres de separación, en el mismo formato que a continuación:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Quiero que cada URL esté en una nueva línea. Traté de hacer esto reemplazando todas las instancias de "http: //" con "\ nhttp: //" usando sed
sed 's_http://_\nhttp://_g' urls.txt
pero ocurre una falla de segmentación (violación de memoria). Solo puedo suponer que el tamaño del archivo (más de 100 GB) está causando que sed supere algún límite.
Podría dividir el archivo en varios archivos más pequeños para su procesamiento, pero todas las instancias de "http: //" tendrían que mantenerse intactas.
¿Hay una mejor manera de hacer esto?
text-processing
sed
C Sawyer
fuente
fuente

Respuestas:
Con
awkusted puede evitar leer una gran cantidad de texto a la vez:El éxito puede depender de la
awkimplementación utilizada . Por ejemplogawkfunciona bien, pero semawkbloquea.fuente
Esto hará el trabajo:
Al establecer $ / , he cambiado la definición de una línea para que termine en
//lugar de una nueva línea. Esto hace que Perl lea una URL a la vez. Es poco probable que una URL contenga,//excepto después del esquema, pero está bien si uno lo hace, la expresión regular evitará que agregue nuevas líneas espurias.Si desea evitar agregar una línea en blanco antes de la primera URL:
Puede probar la evaluación comparativa para ver si
s!http://\z!\nhttp://!es más rápido. Son equivalentes. Tenga en cuenta que la/gbandera no es necesaria en la sustitución, porque solo puede haber una coincidencia por "línea".fuente
$/, solo se tratará de una URL a la vez.man perlvar, pero tiene sentido de esa manera.http:parte de la expresión regular. Examinará todos//, pero no agregará una nueva línea a menos que encuentrehttp://.:con una nueva línea, para cortar el archivo.httpal final de la línea conhttp:y agregue la siguiente líneaEstos pasos se ven así:
Compruebe si hay líneas que no comienzan
http://, imprima los números de línea. Esto solo ocurriría si a: está en algún lugar de la URL que no sea después dehttp.grep -nv '^http://'fuente