Я хотел извлечь размер 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?