我想将包含 HTTP 响应的文件拆分为两个文件:一个仅包含 HTTP 标头,另一个包含消息正文。为此,我需要使用shell script\r
在第一个空行(或对于 UNIX 工具的第一行仅包含 CR = ' ' 字符)将一个文件拆分为两个。
如何以可移植的方式做到这一点(例如使用sed,但没有 GNU 扩展)?可以假设空行不会是文件中的第一行。空行可以到达任何一个文件,没有一个或两个文件;对我来说没关系。
我想将包含 HTTP 响应的文件拆分为两个文件:一个仅包含 HTTP 标头,另一个包含消息正文。为此,我需要使用shell script\r
在第一个空行(或对于 UNIX 工具的第一行仅包含 CR = ' ' 字符)将一个文件拆分为两个。
如何以可移植的方式做到这一点(例如使用sed,但没有 GNU 扩展)?可以假设空行不会是文件中的第一行。空行可以到达任何一个文件,没有一个或两个文件;对我来说没关系。
您可以使用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 '/^$/' '{*}'
该模式'{*}'
使前面的模式尽可能多地重复。
$ 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*$/
给定 awk 脚本
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