2009-10-29 28 views
11

Ich möchte eine Datei, die HTTP-Antwort enthält, in zwei Dateien aufteilen: eine, die nur HTTP-Header enthält, und eine, die den Text einer Nachricht enthält. Dazu muss ich eine Datei in zwei erste Zeile aufteilen (oder für UNIX-Tools in der ersten Zeile, die nur CR = '\r' Zeichen) mit einem Shell-Skript .Wie teilt man die Datei auf der ersten leeren Zeile in einer tragbaren Weise in der Shell auf (z. B. mit sed)?

Wie dies auf eine tragbare Weise (zum Beispiel mit sed, aber ohne GNU-Erweiterungen) zu tun? Man kann annehmen, dass eine leere Zeile nicht die erste Zeile in einer Datei ist. Leere Zeile kann zu einer, keiner oder beiden Dateien gelangen; es ist mir egal.

Antwort

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 

Ändern Sie den /^$/-/^\s*$/, wenn Sie dort erwarten auf der Leerzeile Leerzeichen sein.

+3

Es sollte wahrscheinlich '/^\ r $ /' (oder nur für den Fall '/^\ r? $ /') Sein –

+0

Im Falle der Verwendung/^ \ r? $/Dort sollte auch -r Schlüssel verwendet werden . – Hubbitus

4

die awk-Skript Bei

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

awk -f foo.awk < httpfile für Sie die beiden Dateien headers und body wird auszuschreiben.

+0

+1 elegant (bis 15 Zeichen) –

0

Sie können den ersten Teil Ihrer Datei extrahieren (HTTP-Header) mit:

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

und den zweiten Teil (HTTP Körper) mit:

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

Sie csplit verwenden können:

echo "a 
b 
c 

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

Oder

csplit -s filename '/^$/' 

(vorausgesetzt, der Inhalt von "Dateiname" sind die gleichen wie die Ausgabe des Echos) würde in diesem Fall zwei Dateien namens "xx00" und "xx01" erstellen. Das Präfix kann von "xx" in "outfile" geändert werden, zum Beispiel mit -f outfile und die Anzahl der Ziffern im Dateinamen könnte mit -n 3 in 3 geändert werden. Sie können eine komplexere Regex verwenden, wenn Sie mit Macintosh-Zeilenendungen arbeiten müssen.

Um eine Datei in jeder Leerzeile aufgeteilt, können Sie verwenden:

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

Das Muster '{*}' das vorhergehende Muster so oft wie möglich wiederholt werden verursacht.

+5

+1 Sie können es auch verwenden, um die Datei in mehr als 2 Teile zu teilen. –

+0

können Sie es direkt in ein Array in bash tun, anstatt Dateien zu erstellen? –

+1

@ZacThompson: Ich habe die Antwort bearbeitet, um dies zu sagen, aber bis es überprüft wird: Sie können '{*} '' am Ende des obigen Befehls hinzufügen, um mehrere Male zu teilen. z.B. 'csplit filename '/^$ /' '{*}'' – kbeta