如何在shell中以可移植的方式在第一个空行上拆分文件(例如使用sed)?
-
10-07-2019 - |
题
我想将包含HTTP响应的文件拆分为两个文件:一个只包含HTTP头,另一个包含消息正文。为此,我需要使用 shell脚本在第一个空行(或第一行上仅包含CR ='\r
'字符的UNIX工具)中将文件拆分为两个。
如何以便携方式执行此操作(例如使用 sed ,但没有GNU扩展名)?可以假设空行不是文件中的第一行。空行可以得到文件中的任何一个,没有一个或两个;对我来说无关紧要。
解决方案
$ 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*$/
。
其他提示
您可以使用csplit
:
echo "a
b
c
d
e
f" | csplit -s - '/^$/'
或者
csplit -s filename '/^$/'
(假设<!>“filename <!>”的内容与echo的输出相同)将在这种情况下创建两个名为<!> quot; xx00 <!> quot;的文件。和<!>“; xx01 <!>”;前缀可以从<!>“xx <!>”更改; to <!> quot; outfile <!> quot ;,例如,带-f outfile
,文件名中的位数可以用-n 3
更改为3。如果需要处理Macintosh行结尾,可以使用更复杂的正则表达式。
要在每个空行拆分文件,您可以使用:
csplit -s filename '/^$/' '{*}'
模式'{*}'
会使前面的模式重复多次。
给出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
不隶属于 StackOverflow