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