Domanda

Voglio dividere un file contenente la risposta HTTP in due file: uno contenente solo le intestazioni HTTP e uno contenente il corpo di un messaggio. Per questo ho bisogno di dividere un file in due sulla prima riga vuota (o per gli strumenti UNIX sulla prima riga contenente solo il carattere CR = '\r') usando uno script di shell .

Come farlo in modo portatile (ad esempio usando sed , ma senza estensioni GNU)? Si può presumere che la riga vuota non sia la prima riga in un file. La riga vuota può arrivare a nessuno o entrambi i file; non importa per me.

È stato utile?

Soluzione

$ cat test.txt
a
b
c

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

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

Cambia /^$/ in /^\s*$/ se pensi che ci possa essere spazio bianco sulla riga vuota.

Altri suggerimenti

Puoi usare csplit:

echo "a
b
c

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

o

csplit -s filename '/^$/'

(assumendo il contenuto di " nome file " sono gli stessi dell'output dell'eco) creerebbe, in questo caso, due file chiamati " xx00 " e " xx01 " ;. Il prefisso può essere modificato da & Quot; xx & Quot; in " outfile " ;, ad esempio, con -f outfile e il numero di cifre nel nome file può essere modificato in 3 con -n 3. Puoi usare una regex più complessa se hai bisogno di gestire i finali di linea Macintosh.

Per dividere un file su ogni riga vuota, puoi usare:

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

Lo schema '{*}' fa sì che lo schema precedente venga ripetuto il più volte possibile.

Dato lo script awk

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

awk -f foo.awk < httpfile scriverà i due file headers e body per te.

Puoi estrarre la prima parte del tuo file (intestazioni HTTP) con:

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

e la seconda parte (corpo HTTP) con:

awk '{if(body)print;if($0=="")body=1}' myFile
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top