我想将包含HTTP响应的文件拆分为两个文件:一个只包含HTTP头,另一个包含消息体。为此,我需要使用shell脚本在第一个空行(或UNIX工具在第一行只包含CR = '\r'字符)将文件拆分为两个。如何用一种可移植的方式(例如使用sed,但不使用GNU扩展)来实现这一点?人们可以假设空行不会是文件的第一行。空行可以到达两个文件中的任何一个,或者两个文件都没有;对我来说无所谓。
\r
bbuxkriu1#
您可以使用csplit:
csplit
echo "a b c d e f" | csplit -s - '/^$/'
或者
csplit -s filename '/^$/'
(假设“filename”的内容与回显的输出相同)在这种情况下将创建两个名为“xx00”和“xx01”的文件。前缀可以从“xx”改变为“outfile”,例如,-f outfile,并且文件名中的位数可以用-n 3更改为3。如果需要处理Macintosh行尾,可以使用更复杂的正则表达式。要在每个空行处拆分文件,可以用途:
-f outfile
-n 3
csplit -s filename '/^$/' '{*}'
模式'{*}'使得前面的模式尽可能多地重复。
'{*}'
gcuhipw92#
$ 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*$/。
/^$/
/^\s*$/
guicsvcw3#
给定awk脚本
BEGIN { fout="headers" } /^$/ { fout="body" } { print $0 > fout }
awk -f foo.awk < httpfile将为您写出两个文件headers和body。
awk -f foo.awk < httpfile
headers
body
mzaanser4#
您可以使用以下命令提取文件的第一部分(HTTP头):
awk '{if($0~"^\r*$")exit;print}' myFile
第二部分(HTTP主体)具有:
awk '{if(body)print;if($0~"^\r*$")body=1}' myFile
4条答案
按热度按时间bbuxkriu1#
您可以使用
csplit
:或者
(假设“filename”的内容与回显的输出相同)在这种情况下将创建两个名为“xx00”和“xx01”的文件。前缀可以从“xx”改变为“outfile”,例如,
-f outfile
,并且文件名中的位数可以用-n 3
更改为3。如果需要处理Macintosh行尾,可以使用更复杂的正则表达式。要在每个空行处拆分文件,可以用途:
模式
'{*}'
使得前面的模式尽可能多地重复。gcuhipw92#
如果您预计空行中可能有空白,请将
/^$/
更改为/^\s*$/
。guicsvcw3#
给定awk脚本
awk -f foo.awk < httpfile
将为您写出两个文件headers
和body
。mzaanser4#
您可以使用以下命令提取文件的第一部分(HTTP头):
第二部分(HTTP主体)具有: