シェルでポータブルな方法で最初の空の行にファイルを分割する方法(たとえば、sedを使用)?

StackOverflow https://stackoverflow.com/questions/1644532

質問

HTTP応答を含むファイルを2つのファイルに分割します。1つはHTTPヘッダーのみを含み、もう1つはメッセージの本文を含みます。このため、シェルスクリプトを使用して、最初の空行でファイルを2つに分割する必要があります(またはUNIXツールの場合、CR = '\r'文字のみを含む最初の行)。

移植可能な方法でこれを行う方法(たとえば、 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 '/^$/'

(<!> quot; filename <!> quotの内容がエコーの出力と同じであると想定)は、この場合、<!> quot; xx00 <!> quotという名前の2つのファイルを作成します。および<!> quot; xx01 <!> quot;。プレフィックスは<!> quot; xx <!> quot;から変更できます。 <!> 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は、2つのファイルheadersおよびbodyを書き出します。

次のコマンドを使用して、ファイルの最初の部分(HTTPヘッダー)を抽出できます。

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

および次の部分(HTTP本文):

awk '{if(body)print;if($0=="")body=1}' myFile
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top