![在 curl 请求之后管道化 grep 时,正则表达式的工作方式非常奇怪](https://linux22.com/image/938802/%E5%9C%A8%20curl%20%E8%AF%B7%E6%B1%82%E4%B9%8B%E5%90%8E%E7%AE%A1%E9%81%93%E5%8C%96%20grep%20%E6%97%B6%EF%BC%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%96%B9%E5%BC%8F%E9%9D%9E%E5%B8%B8%E5%A5%87%E6%80%AA.png)
问题很简单但确实很奇怪。
当我发出 curl 请求并执行时... | grep -Po "^\d+$"
,它什么也没有返回,尽管应该有 400 多个结果匹配。见下文:
#example snippet of curl output
107
00:15:54,936 --> 00:15:56,646
Yeah, this is him.
We got him.
108
00:16:07,823 --> 00:16:11,869
So, how long
you been in South Florida?
109
00:16:11,953 --> 00:16:13,871
A while.
Before that?
110
00:16:17,166 --> 00:16:20,253
We know you're Brian O'Conner,
formerly of the LAPD.
111
00:16:21,128 --> 00:16:23,214
- You got the wrong guy.
- Really?
112
00:16:28,177 --> 00:16:29,929
How you doing, O'Conner?
这就是 curl 输出的一部分。本例中完整输出达到 1000+(此处为 107-112)。现在:
$ [curl request] | grep -Po "^\d+$"
[empty response]
$ [curl request] | grep -Po "^\d+"
[shit ton of results]
我真的不明白。我也尝试过添加-a
到 grep 但也没有用。
为什么 $ 不起作用?还有一个更好的问题:为什么它会导致每次匹配都无效(即没有匹配)?
编辑:上面 curl 代码片段的 xxd 输出
00000000: 3130 370d 0a30 303a 3135 3a35 342c 3933 107..00:15:54,93
00000010: 3620 2d2d 3e20 3030 3a31 353a 3536 2c36 6 --> 00:15:56,6
00000020: 3436 0d0a 5965 6168 2c20 7468 6973 2069 46..Yeah, this i
00000030: 7320 6869 6d2e 0d0a 5765 2067 6f74 2068 s him...We got h
00000040: 696d 2e0d 0a0d 0a31 3038 0d0a 3030 3a31 im.....108..00:1
00000050: 363a 3037 2c38 3233 202d 2d3e 2030 303a 6:07,823 --> 00:
00000060: 3136 3a31 312c 3836 390d 0a53 6f2c 2068 16:11,869..So, h
00000070: 6f77 206c 6f6e 670d 0a79 6f75 2062 6565 ow long..you bee
00000080: 6e20 696e 2053 6f75 7468 2046 6c6f 7269 n in South Flori
00000090: 6461 3f0d 0a0d 0a31 3039 0d0a 3030 3a31 da?....109..00:1
000000a0: 363a 3131 2c39 3533 202d 2d3e 2030 303a 6:11,953 --> 00:
000000b0: 3136 3a31 332c 3837 310d 0a41 2077 6869 16:13,871..A whi
000000c0: 6c65 2e0d 0a42 6566 6f72 6520 7468 6174 le...Before that
000000d0: 3f0d 0a0d 0a31 3130 0d0a 3030 3a31 363a ?....110..00:16:
000000e0: 3137 2c31 3636 202d 2d3e 2030 303a 3136 17,166 --> 00:16
000000f0: 3a32 302c 3235 330d 0a57 6520 6b6e 6f77 :20,253..We know
00000100: 2079 6f75 2772 6520 4272 6961 6e20 4f27 you're Brian O'
00000110: 436f 6e6e 6572 2c0d 0a66 6f72 6d65 726c Conner,..formerl
00000120: 7920 6f66 2074 6865 204c 4150 442e 0d0a y of the LAPD...
00000130: 0d0a 3131 310d 0a30 303a 3136 3a32 312c ..111..00:16:21,
00000140: 3132 3820 2d2d 3e20 3030 3a31 363a 3233 128 --> 00:16:23
00000150: 2c32 3134 0d0a 2d20 596f 7520 676f 7420 ,214..- You got
00000160: 7468 6520 7772 6f6e 6720 6775 792e 0d0a the wrong guy...
00000170: 2d20 5265 616c 6c79 3f0d 0a0d 0a31 3132 - Really?....112
00000180: 0d0a 3030 3a31 363a 3238 2c31 3737 202d ..00:16:28,177 -
00000190: 2d3e 2030 303a 3136 3a32 392c 3932 390d -> 00:16:29,929.
000001a0: 0a48 6f77 2079 6f75 2064 6f69 6e67 2c20 .How you doing,
000001b0: 4f27 436f 6e6e 6572 3f0d 0a O'Conner?..
答案1
您的 curl 命令输出具有 DOS 样式的 CRLF 行结尾 - 因此您正在寻找的行不以 结尾\d+
,而是以 结尾\d+\r
您可以将 grep 命令更改为grep -Po "^\d+\r$"
- 这将匹配您要查找的内容,但输出将包含回车符。使用彩色输出(即当grep
别名为grep --color=auto
并且输出转到终端时),CR 会导致输出被颜色代码字符覆盖,因此它看起来是空的。如果您正在管道或重定向输出,这可能不是问题。否则,一些选项是:
通过管道将 curl 输出
tr
删除回车符,例如。curl ... | tr -d '\r' | grep -Po "^\d+$"
使用 Perl 更改 RE 以匹配但不包含 CR展望
curl ... | grep -Po "^\d+(?=\r$)"