Как разбить файл на первую пустую строку переносимым способом в оболочке (например, с помощью sed)?

Я хочу разбить файл, содержащий HTTP-ответ, на два файла: один, содержащий только HTTP-заголовки, и один, содержащий тело сообщения. Для этого мне нужно разбить файл на две части на первой пустой строке (или для инструментов UNIX в первой строке, содержащей только символ CR = '\r "), используя оболочку script.

Как это сделать переносимым способом (например, с помощью sed, но без расширений GNU)? Можно предположить, что пустая строка не будет первой строкой в ​​файле. Пустую строку можно получить либо, ни один или оба файла; для меня это не имеет значения.

Ответ 1

$ cat test.txt
a
b
c

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

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

Измените /^$/ на /^\s*$/, если вы ожидаете, что на пустой строке могут быть пробелы.

Ответ 2

Вы можете использовать csplit:

echo "a
b
c

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

или

csplit -s filename '/^$/'

(при условии, что содержимое "filename" совпадает с выходом echo) создало бы в этом случае два файла с именем "xx00" и "xx01". Префикс можно изменить с "xx" на "outfile", например, с помощью -f outfile, а число цифр в имени файла может быть изменено на 3 с помощью -n 3. Вы можете использовать более сложное регулярное выражение, если вам нужно иметь дело с окончанием строки Macintosh.

Чтобы разбить файл на каждую пустую строку, вы можете использовать:

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

Образец '{*}' заставляет предыдущий шаблон повторяться столько раз, сколько возможно.

Ответ 3

Учитывая awk script

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

awk -f foo.awk < httpfile выведет для вас два файла headers и body.

Ответ 4

Вы можете извлечь первую часть своего файла (заголовки HTTP) с помощью

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

а вторая часть (тело HTTP):

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