2009-10-29 7 views
11

Quiero dividir un archivo que contiene la respuesta HTTP en dos archivos: uno que contiene solo encabezados HTTP y otro que contiene el cuerpo de un mensaje. Para esto necesito dividir un archivo en dos en la primera línea vacía (o para las herramientas de UNIX en la primera línea que contiene solo el carácter CR = '\r') usando un script de shell .Cómo dividir el archivo en la primera línea vacía de forma portátil en el intérprete de comandos (por ejemplo, usando sed)?

cómo hacer esto de una manera portátil (por ejemplo, usando sed, pero sin extensiones de GNU)? Se puede suponer que la línea vacía no sería la primera línea de un archivo. La línea vacía puede llegar a cualquiera, ninguno o ambos archivos; no me importa

Respuesta

14
$ cat test.txt 
a 
b 
c 

d 
e 
f 
$ sed '/^$/q' test.txt 
a 
b 
c 

$ sed '1,/^$/d' test.txt 
d 
e 
f 

Cambiar el /^$/-/^\s*$/ si espera puede haber espacios en blanco en la línea en blanco.

+3

Probablemente debería ser '/^\ r $ /' (o solo en el caso de '/^\ r? $ /') –

+0

En caso de usar/^ \ r? $/Allí también debe usarse la clave -r . – Hubbitus

4

Teniendo en cuenta la secuencia de comandos awk

BEGIN { fout="headers" } 
/^$/ { fout="body" } 
{ print $0 > fout } 

awk -f foo.awk < httpfile escribirá los dos archivos headers y body para usted.

+0

+1 elegante (hasta 15 caracteres) –

0

Puede extraer la primera parte de su archivo (cabeceras HTTP) con:

awk '{if($0=="")exit;print}' myFile 

y la segunda parte (HTTP corporal) con:

awk '{if(body)print;if($0=="")body=1}' myFile 
15

Puede utilizar csplit:

echo "a 
b 
c 

d 
e 
f" | csplit -s - '/^$/' 

O

csplit -s filename '/^$/' 

(suponiendo que el contenido de "nombre de archivo" sea el mismo que el resultado del eco) crearía, en este caso, dos archivos llamados "xx00" y "xx01". El prefijo se puede cambiar de "xx" a "archivo de salida", por ejemplo, con -f outfile y la cantidad de dígitos en el nombre de archivo podría cambiarse a 3 con -n 3. Puede usar una expresión regular más compleja si necesita lidiar con terminaciones de línea Macintosh.

Para dividir un archivo en cada línea vacía, puede utilizar:

csplit -s filename '/^$/' '{*}' 

El patrón '{*}' hace que el patrón anterior se repite tantas veces como sea posible.

+5

+1 también puede usarlo para dividir el archivo en más de 2 partes. –

+0

¿puedes hacerlo directamente a una matriz en bash, en lugar de crear archivos? –

+1

@ZacThompson: edité la respuesta para indicar esto, pero hasta que se revise: puede agregar ''{*}'' al final del comando anterior para dividir varias veces. p.ej. 'csplit filename '/^$ /' '{*}' ' – kbeta

Cuestiones relacionadas