如何在一个可移植的方式在外壳(例如,使用SED)各执第一空行文件?(How to split fil

2019-09-02 07:17发布

我想文件方含HTTP响应分成两个文件:一个仅含有HTTP标头,和一个方含一个消息的主体中。 为此,我需要在第一空行一个文件分割成两个(或用于在第一行UNIX工具仅包含CR =“ \r使用shell脚本 ”字符)。

如何做到这一点的可移植的方法(例如,使用SED,但没有GNU扩展)? 我们可以假设,空行不会在一个文件中的第一行。 空行可以拿到要么,没有或两个文件的; 没关系我。

Answer 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

更改/^$//^\s*$/如果你希望有可能是空白的空行。



Answer 2:

您可以使用csplit

echo "a
b
c

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

要么

csplit -s filename '/^$/'

(假设的“文件名”的内容是一样的回声的输出)会产生,在这种情况下,两个文件名为“XX00”和“XX01”。 前缀可以从“XX”到“OUTFILE”被改变,例如,用-f outfile和的文件名中的数字的数量可以被改变至3 -n 3 。 如果你需要处理的Macintosh线结局。你可以使用更复杂的正则表达式。

要拆分在每个空行的文件时,您可以使用:

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

图案'{*}'导致要重复多次尽可能前述图案。



Answer 3:

鉴于awk脚本

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

awk -f foo.awk < httpfile将写出两个文件headersbody给你的。



Answer 4:

您可以提取您的文件(HTTP头)与第一部分:

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

和第二部分(HTTP体)配有:

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


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