如果最后一位数字位于行尾,为什么 sed regexp 数字字符类包含 CR 字符?

如果最后一位数字位于行尾,为什么 sed regexp 数字字符类包含 CR 字符?

我想从 URL 中提取 Content-Length 的大小并在同一行输出 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 并截断了我需要的字段。我只回显了“a”,而不是 URL:

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

覆盖"a"第一个数字。

事实证明,Content-Length 标头行以 0D 字符结束,并且与数字一起出现的是回车符。我认为省略cut0D 不够聪明,但只需将提取更改为某些正则表达式工具,其行为也相同:

> 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

但事实并非如此。

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

由于不匹配,所以没有被删除。它只是留在那里。

相关内容