So teilen Sie eine Datei in der ersten leeren Zeile auf portable Weise in der Shell auf (z. B.mit sed)?
-
10-07-2019 - |
Frage
Ich möchte eine Datei mit einer HTTP-Antwort in zwei Dateien aufteilen:eine enthält nur HTTP-Header und eine enthält den Nachrichtentext.Dazu muss ich eine Datei in der ersten leeren Zeile in zwei Teile aufteilen (oder für UNIX-Tools in der ersten Zeile, die nur CR = ' enthält)\r
' Zeichen) mit a Shell-Skript.
Wie geht das auf portable Art und Weise (zum Beispiel mit sed, aber ohne GNU-Erweiterungen)?Man kann davon ausgehen, dass eine leere Zeile nicht die erste Zeile in einer Datei wäre.Eine leere Zeile kann zu einer, keiner oder beiden Dateien gelangen;es ist mir egal.
Lösung
$ 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 kann.
Andere Tipps
Sie können verwenden csplit
:
echo "a
b
c
d
e
f" | csplit -s - '/^$/'
Oder
csplit -s filename '/^$/'
(vorausgesetzt, der Inhalt von „Dateiname“ ist mit der Ausgabe des Echos identisch) würde in diesem Fall zwei Dateien mit den Namen „xx00“ und „xx01“ erstellen.Das Präfix kann beispielsweise mit von „xx“ in „outfile“ geändert werden -f outfile
und die Anzahl der Ziffern im Dateinamen könnte mit auf 3 geändert werden -n 3
.Sie können einen komplexeren regulären Ausdruck verwenden, wenn Sie mit Macintosh-Zeilenenden umgehen müssen.
Um eine Datei an jeder leeren Zeile zu teilen, können Sie Folgendes verwenden:
csplit -s filename '/^$/' '{*}'
Das Muster '{*}'
bewirkt, dass das vorhergehende Muster so oft wie möglich wiederholt wird.
In Anbetracht des awk-Skript
BEGIN { fout="headers" }
/^$/ { fout="body" }
{ print $0 > fout }
awk -f foo.awk < httpfile
die beiden Dateien headers
und body
für Sie schreiben.
Sie können den ersten Teil Ihrer Datei extrahieren (HTTP-Header) mit:
awk '{if($0=="")exit;print}' myFile
und der zweite Teil (HTTP Körper) mit:
awk '{if(body)print;if($0=="")body=1}' myFile