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:
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.)
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
Następnie pomyślałem o zastąpieniuperl
, używając/s
odyfikator @, 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
.-0
pcji @ 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”.
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.
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.