シェルでポータブルな方法で最初の空の行にファイルを分割する方法(たとえば、sedを使用)?
-
10-07-2019 - |
質問
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