How to split file on first empty line in a portable way in shell (e.g. using sed)?

こ雲淡風輕ζ 提交于 2019-11-30 23:04:17

问题


I want to split a file containg HTTP response into two files: one containing only HTTP headers, and one containg the body of a message. For this I need to split a file into two on first empty line (or for UNIX tools on first line containing only CR = '\r' character) using a shell script.

How to do this in a portable way (for example using sed, but without GNU extensions)? One can assume that empty line would not be first line in a file. Empty line can got to either, none or both of files; it doesn't matter to me.


回答1:


$ cat test.txt
a
b
c

d
e
f
$ sed '/^$/q' test.txt 
a
b
c

$ sed '1,/^$/d' test.txt 
d
e
f

Change the /^$/ to /^\s*$/ if you expect there may be whitespace on the blank line.




回答2:


You can use csplit:

echo "a
b
c

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

Or

csplit -s filename '/^$/'

(assuming the contents of "filename" are the same as the output of the echo) would create, in this case, two files named "xx00" and "xx01". The prefix can be changed from "xx" to "outfile", for example, with -f outfile and the number of digits in the filename could be changed to 3 with -n 3. You can use a more complex regex if you need to deal with Macintosh line endings.

To split a file at each empty line, you can use:

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

The pattern '{*}' causes the preceding pattern to be repeated as many times as possible.




回答3:


Given the awk script

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

awk -f foo.awk < httpfile will write out the two files headers and body for you.




回答4:


You can extract the first part of your file (HTTP headers) with:

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

and the second part (HTTP body) with:

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


来源:https://stackoverflow.com/questions/1644532/how-to-split-file-on-first-empty-line-in-a-portable-way-in-shell-e-g-using-sed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!