Я хотел извлечь размер Content-Length из URL и вывести URL + $ size в той же строке.

Данные, с которыми я работал:

> curl -I -s http://yahoo.com
HTTP/1.1 301 Redirect
Date: Thu, 10 Mar 2016 13:58:34 GMT
Via: https/1.1 ir18.fp.bf1.yahoo.com (ApacheTrafficServer)
Server: ATS
Location: https://www.yahoo.com/
Content-Type: text/html
Content-Language: en
Cache-Control: no-store, no-cache
Connection: keep-alive
Y-Trace: BAEAQAAAAADEVnKTAIhTVAAAAAAAAAAA52rmwEDlxSwAAAAAAAAAAAAFLbI13bX.AAUtsjXdvxvBYm3xAAAAAA--
Content-Length: 304

Вот упрощенный пример. Я извлек Content-Length и просто отрезал нужное мне поле. Вместо URL я просто повторяю "а":

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | cut -f2 -d" "); echo $size"a"
> a04

"a" перезаписывает первую цифру.

Оказывается, строка заголовка Content-Length закрыта с символом 0D и вместе с числами идет этот возврат каретки. Я думал, что cut не достаточно умен, чтобы оставить 0D выключенным, но просто изменив извлечение на какой-то инструмент regexp, он ведет себя так же:

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | sed 's/Content-Length: \([[:digit:]]*\)/\1/'); echo $size"a"
> a04

Это означает, что класс символов [[:digit:]] также содержит символ 0D. Я попытался явно пометить конец строки, и это сработало:

> size=$(curl -I -s http://yahoo.com | grep "Content-Length:" | sed 's/Content-Length: \([[:digit:]]*\).*/\1/'); echo $size"a"
> 304a

TL; DR: почему в класс символов регулярного выражения включен символ 0D?

1 ответ1

1

Это не так.

strintg:     Content-Length: 304\0d
matched:     Content-Length: 304
replaced by:                 304
result:                      304\0d

Он не был сопоставлен и поэтому не был удален. Он просто остался там.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .