如何在 shell 中以可移植的方式在第一个空行上分割文件(例如使用 sed)?
我想将包含 HTTP 响应的文件拆分为两个文件:一个仅包含 HTTP 标头,另一个包含消息正文。为此,我需要使用 shell 脚本 在第一个空行上将文件分成两个(或者对于第一行仅包含 CR = '\r
' 字符的 UNIX 工具) 。
如何以可移植的方式执行此操作(例如使用 sed,但不使用 GNU 扩展)?人们可以假设空行不会是文件中的第一行。空行可以到达其中一个文件,也可以不到达或同时到达两个文件;这对我来说并不重要。
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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以使用 csplit:
或者
(假设“filename”的内容与 echo 的输出相同)在本例中将创建两个名为“xx00”和“xx01”的文件。前缀可以从“xx”更改为“outfile”,例如使用
-f outfile
,文件名中的位数可以使用-n 3
更改为3代码>.如果需要处理 Macintosh 行结尾,可以使用更复杂的正则表达式。要在每个空行处分割文件,您可以使用:
模式
'{*}'
使前面的模式重复尽可能多的次数。You can use
csplit
:Or
(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:
The pattern
'{*}'
causes the preceding pattern to be repeated as many times as possible.如果您预计空行上可能有空格,请将
/^$/
更改为/^\s*$/
。Change the
/^$/
to/^\s*$/
if you expect there may be whitespace on the blank line.给定 awk 脚本
awk -f foo.awk < httpfile
将为您写出headers
和body
两个文件。Given the awk script
awk -f foo.awk < httpfile
will write out the two filesheaders
andbody
for you.您可以使用以下命令提取文件的第一部分(HTTP 标头):
并使用以下命令提取第二部分(HTTP 正文):
You can extract the first part of your file (HTTP headers) with:
and the second part (HTTP body) with: