It didn't.
strintg: Content-Length: 304\0d matched: Content-Length: 304 replaced by: 304 result: 304\0d
It wasn't matched, and therefore wasn't removed. It just stayed there.
Я хотел извлечь размер 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 выключенным, но просто изменив извлечение на какой-то инструмент регулярных выражений, он ведет себя так же:
> 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?
It didn't.
strintg: Content-Length: 304\0d matched: Content-Length: 304 replaced by: 304 result: 304\0d
It wasn't matched, and therefore wasn't removed. It just stayed there.