我想从 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 字符结束,并且与数字一起出现的是回车符。我认为省略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 字符?
答案1
但事实并非如此。
strintg: Content-Length: 304\0d
matched: Content-Length: 304
replaced by: 304
result: 304\0d
由于不匹配,所以没有被删除。它只是留在那里。