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

StackOverflow https://stackoverflow.com/questions/1644532

Вопрос

Я хочу разделить файл, содержащий 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top