Как разбить файл на первую пустую строку переносимым способом в оболочке (например, используя sed)? - PullRequest
11 голосов
/ 29 октября 2009

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

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

Ответы [ 4 ]

15 голосов
/ 30 октября 2009

Вы можете использовать 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 '/^$/' '{*}'

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

14 голосов
/ 29 октября 2009
$ 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*$/, если вы ожидаете, что в пустой строке могут быть пробелы.

4 голосов
/ 29 октября 2009

Учитывая скрипт awk

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

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

0 голосов
/ 29 октября 2009

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

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

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

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