

`curl -i` を利用すると以下の出力が得られるようです。

[code]

    status code
    header
    header
    header
    
    body
    body
    body
    
[/code]

この最初の `\n\n` を境界として、最終的には以下のような出力を得たいです。  
どうすればいいでしょうか。

[code]

    body
    body
    body
    
    status code
    header
    header
    header
    
[/code]

できればワンライナー(パイプでつなげる感じで)だと嬉しいです。


CC BY-SA 4.0
2020-08-11T09:05:18.703
69455
2020-08-11T11:34:28.940
2020-08-11T11:34:28.940
3060
427
question
shellscript shell
シェルスクリプトでcurl -i のheaderとbodyを入れ替えるには


とりあえず書いてみました。もうちょっときれいに書けるかもしれません。

[code]

    $ cat hoge.txt
    status code
    header
    header
    header
    
    body
    body
    body
    $ cat hoge.txt | awk '/^$/{f=1;next};{if(!f){d=d $0 "\n"}else{print}};END{printf "\n" d}'
    body
    body
    body
    
    status code
    header
    header
    header
    
[/code]

sedでも書いてみました。

[code]

    $ cat hoge.txt | sed -e '1,/^$/{/^$/d;H;d}' -e '$G'
    body
    body
    body
    
    status code
    header
    header
    header
    
[/code]


CC BY-SA 4.0
2020-08-11T09:22:22.770
69458
2020-08-11T09:51:40.777
2020-08-11T09:51:40.777
30745
30745
69455
answer


以下は awk を使う方法の一例ですが、`RS(Record Separator)` を `HTTP response header` と
`response body` の区切り文字列(`\r\n\r\n`) に設定しています。

[code]

    $ curl -s -i https://example.com/ | awk -vRS='\r\n\r\n' 'NR==1{first=$0}NR>1;END{print first}'
    <!doctype html>
    <html>
    <head>
        <title>Example Domain</title>
                    :
    
    </body>
    </html>
    
    HTTP/2 200 
    accept-ranges: bytes
    age: 411753
    cache-control: max-age=604800
    content-type: text/html; charset=UTF-8
    date: Tue, 11 Aug 2020 10:22:39 GMT
    etag: "3147526947+ident"
    expires: Tue, 18 Aug 2020 10:22:39 GMT
    last-modified: Thu, 17 Oct 2019 07:18:26 GMT
    server: ECS (sjc/4E74)
    vary: Accept-Encoding
    x-cache: HIT
    content-length: 1256
    
[/code]


CC BY-SA 4.0
2020-08-11T10:30:22.093
69459
2020-08-11T10:30:22.093
69455
answer