如何在shell中以可移植的方式(例如使用sed)在第一个空行上分割文件?

zzoitvuj  于 2023-02-19  发布在  Shell
关注(0)|答案(4)|浏览(144)

我想将包含HTTP响应的文件拆分为两个文件:一个只包含HTTP头,另一个包含消息体。为此,我需要使用shell脚本在第一个空行(或UNIX工具在第一行只包含CR = '\r'字符)将文件拆分为两个。
如何用一种可移植的方式(例如使用sed,但不使用GNU扩展)来实现这一点?人们可以假设空行不会是文件的第一行。空行可以到达两个文件中的任何一个,或者两个文件都没有;对我来说无所谓。

bbuxkriu

bbuxkriu1#

您可以使用csplit

echo "a
b
c

d
e
f" | csplit -s - '/^$/'

或者

csplit -s filename '/^$/'

(假设“filename”的内容与回显的输出相同)在这种情况下将创建两个名为“xx00”和“xx01”的文件。前缀可以从“xx”改变为“outfile”,例如,-f outfile,并且文件名中的位数可以用-n 3更改为3。如果需要处理Macintosh行尾,可以使用更复杂的正则表达式。
要在每个空行处拆分文件,可以用途:

csplit -s filename '/^$/' '{*}'

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

gcuhipw9

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*$/

guicsvcw

guicsvcw3#

给定awk脚本

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

awk -f foo.awk < httpfile将为您写出两个文件headersbody

mzaanser

mzaanser4#

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

awk '{if($0~"^\r*$")exit;print}' myFile

第二部分(HTTP主体)具有:

awk '{if(body)print;if($0~"^\r*$")body=1}' myFile

相关问题