11

我想将包含 HTTP 响应的文件拆分为两个文件:一个仅包含 HTTP 标头,另一个包含消息正文。为此,我需要使用shell script\r在第一个空行(或对于 UNIX 工具的第一行仅包含 CR = ' ' 字符)将一个文件拆分为两个。

如何以可移植的方式做到这一点(例如使用sed,但没有 GNU 扩展)?可以假设空行不会是文件中的第一行。空行可以到达任何一个文件,没有一个或两个文件;对我来说没关系。

4

4 回答 4

15

您可以使用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 '/^$/' '{*}'

该模式'{*}'使前面的模式尽可能多地重复。

于 2009-10-29T22:17:23.463 回答
14
$ 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*$/

于 2009-10-29T15:34:02.563 回答
4

给定 awk 脚本

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

awk -f foo.awk < httpfileheaders将为您写出这两个文件body

于 2009-10-29T15:39:20.967 回答
1

您可以使用以下方法提取文件的第一部分(HTTP 标头):

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

第二部分(HTTP 正文):

awk '{if(body)print;if($0=="")body=1}' myFile
于 2009-10-29T15:42:29.940 回答