Ответ 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*$/
, если вы ожидаете, что на пустой строке могут быть пробелы.
Я хочу разбить файл, содержащий HTTP-ответ, на два файла: один, содержащий только HTTP-заголовки, и один, содержащий тело сообщения. Для этого мне нужно разбить файл на две части на первой пустой строке (или для инструментов UNIX в первой строке, содержащей только символ CR = '\r
"), используя оболочку script.
Как это сделать переносимым способом (например, с помощью sed, но без расширений GNU)? Можно предположить, что пустая строка не будет первой строкой в файле. Пустую строку можно получить либо, ни один или оба файла; для меня это не имеет значения.
$ 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*$/
, если вы ожидаете, что на пустой строке могут быть пробелы.
Вы можете использовать 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 '/^$/' '{*}'
Образец '{*}'
заставляет предыдущий шаблон повторяться столько раз, сколько возможно.
Учитывая awk script
BEGIN { fout="headers" }
/^$/ { fout="body" }
{ print $0 > fout }
awk -f foo.awk < httpfile
выведет для вас два файла headers
и body
.
Вы можете извлечь первую часть своего файла (заголовки HTTP) с помощью
awk '{if($0=="")exit;print}' myFile
а вторая часть (тело HTTP):
awk '{if(body)print;if($0=="")body=1}' myFile