Cómo dividir el archivo en la primera línea vacía en un portátil en la shell (por ejemplo,usando sed)?

StackOverflow https://stackoverflow.com/questions/1644532

Pregunta

Quiero dividir un fichero que contiene respuesta HTTP en dos archivos:una que contiene sólo los encabezados HTTP, y uno que contiene el cuerpo de un mensaje.Para ello necesito dividir un archivo en dos, en la primera línea vacía (o para UNIX herramientas de primera línea que contiene CR = '\r el carácter') con un secuencia de comandos de shell.

Cómo hacer esto de una manera portátil (por ejemplo el uso de sed, pero sin extensiones GNU)?Uno puede suponer que la línea de vacío no sería la primera línea en un archivo.Línea de vacío puede obtuvo para cada uno, ninguno o ambos de los archivos;no me importa.

¿Fue útil?

Solución

$ cat test.txt
a
b
c

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

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

Cambie el /^$/ a /^\s*$/ si espera que haya un espacio en blanco en la línea en blanco.

Otros consejos

Puede utilizar csplit:

echo "a
b
c

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

O

csplit -s filename '/^$/'

(suponiendo que el contenido de "nombre de archivo" son la misma como el resultado de la eco) iba a crear, en este caso, dos archivos con el nombre "xx00" y "xx01".El prefijo puede ser cambiado de "xx" a "outfile", por ejemplo, con -f outfile y el número de dígitos en el nombre de archivo puede ser cambiado a 3, con -n 3.Usted puede utilizar un sistema más complejo regex si usted necesita para hacer frente Macintosh finales de línea.

Para dividir un archivo en cada línea de vacío, se puede utilizar:

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

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

Dado el script awk

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

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

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

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

y la segunda parte (cuerpo HTTP) con:

awk '{if(body)print;if($0=="")body=1}' myFile
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top