Почему в классе символов Sed Regexp есть символ CR, если последняя цифра находится в конце строки?

266
karatedog

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

0

1 ответ на вопрос

1
choroba

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.

Эпический разум произошел. karatedog 8 лет назад 0

Похожие вопросы