Bash: Usuń nagłówki z odpowiedzi HTTP

Jeśli mam jakiś tekst zawierający nagłówki HTTP i treść, np .:

HTTP/1.1 200 OK
Cache-Control: public, max-age=38
Content-Type: text/html; charset=utf-8
Expires: Fri, 22 Nov 2013 06:15:01 GMT
Last-Modified: Fri, 22 Nov 2013 06:14:01 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Fri, 22 Nov 2013 06:14:22 GMT

<!DOCTYPE html>
<html>
<head>
    <title>My website</title>
</head>
<body>

Hello world!

</body>
</html>

i ten tekst jest przekazywany z polecenia, jak mogę usunąć nagłówki, aby zostawić tylko ciało?

(W nagłówkach\r\n służy jako podział linii.\r\n\r\n oznacza koniec nagłówków i początek treści.)

Oto, co próbowałem ... oznacza dowolne polecenie, takie jakcat lubcurl, który wyświetli niektóre nagłówki HTTP i treść na standardowe wyjście:

sed

Moim pierwszym pomysłem było zastąpieniesed, aby usunąć wszystko przed pierwszym wystąpieniem\r\n\r\n:

... | sed 's|^.*?\r\n\r\n||'

Ale to nie działa, głównie dlatego, żesed działa tylko na pojedynczych liniach, więc nie może działać na\r lub\n. (Ponadto nie obsługuje? niepochodny operator.)

grep

Myślałem również o użyciugrep z pozytywnym spojrzeniem za\r\n\r\n:

... | grep -oP '(?<=\r\n\r\n).*'

Ale to też nie działa (głównie dlatego, żegrep działa tylko na poszczególnych liniach).

pcregrep ma tryb wieloliniowy -M), alepcregrep często nie jest dostępne (nie jest instalowane domyślnie w Ubuntu 12.04, Mac OS X 10.7 itp.) i chciałbym rozwiązania, które nie wymaga żadnych niestandardowych narzędz

perl

Następnie pomyślałem o zastąpieniuperl, używając/sodyfikator @, dzięki czemu. dopasowuje podział wiersza:

... | perl -pe 's/^.*?\r\n\r\n//s'

Myślę, że jest to bliżej działającego rozwiązania. Myślę jednak, że Perl's Input Record Separator $/) jest\n domyślnie i należy go zmienić na\r\n, aby. może pasować\r\n.-0pcji @ można użyć do ustawienia$/ do pojedynczego znaku, ale nie do wielu znaków. Próbowałem tego, ale nie sądzę, aby było poprawne:

... | perl -pe '$/ = "\r\n"; s/^.*?\r\n\r\n//s'

Również myślę, że^ pasuje do „początku linii”, ale musi pasować do „początku pliku”.

Offset i substring

Miałem pomysł, aby uzyskać offset\r\n\r\n za pomocą

BodyOffset=$(expr index "$MyHttpText" "\r\n\r\n")

, a następnie wyodrębnij treść jako podciąg za pomocą:

HttpBody=${MyHttpText:BodyOffset}

Niestety wersja Mac OS Xexpr nie obsługujeindex. Ponadto, jeśli to możliwe, chciałbym rozwiązania, które nie wymaga tworzenia zmiennych.

Zastąpienie parametru

Innym pomysłem było użycie podstawienia parametrów, gdzie# oznacza „Usuń z$MyHttpText najkrótsza część*\r\n\r\n pasujące do interfejsu$MyHttpText ":

HttpBody=${MyHttpText#*\r\n\r\n}

Ale nie jestem pewien, jak tego użyć w potokowej sekwencji poleceń, i znowu wolę rozwiązanie, które nie wymaga zmiennych.

questionAnswers(5)

yourAnswerToTheQuestion