Điểm:0

Khi đường ống grep sau một yêu cầu cuộn tròn, regex hoạt động rất lạ

lá cờ in
Cas

Vấn đề đơn giản nhưng thực sự kỳ lạ.

Khi tôi thực hiện một yêu cầu cuộn tròn và làm ... | grep -Po "^\d+$", nó không trả về kết quả nào mặc dù có hơn 400 kết quả phù hợp. Xem bên dưới:

#example đoạn mã đầu ra cuộn tròn
107
00:15:54,936 --> 00:15:56,646
Vâng, đây là anh ấy.
Chúng tôi đã có anh ta.

108
00:16:07,823 --> 00:16:11,869
Vậy bao lâu
bạn đã ở Nam Florida?

109
00:16:11,953 --> 00:16:13,871
Một lúc.
Trước đó?

110
00:16:17,166 --> 00:16:20,253
Chúng tôi biết bạn là Brian O'Conner,
trước đây của LAPD.

111
00:16:21,128 --> 00:16:23,214
- Anh nhầm người rồi.
- Có thật không?

112
00:16:28,177 --> 00:16:29,929
Anh khỏe không, O'Conner?

Vì vậy, đó là một phần của đầu ra curl. Đầu ra hoàn chỉnh là hơn 1000 trong trường hợp này (ở đây là 107-112). Hiện nay:

$ [yêu cầu cuộn tròn] | grep -Po "^\d+$"
[trả lời trống rỗng]

$ [yêu cầu cuộn tròn] | grep -Po "^\d+"
[quá nhiều kết quả]

Và tôi thực sự không nhận được nó. Tôi cũng đã cố gắng thêm -một để grep nhưng điều đó cũng không giúp được gì.

Tại sao $ không hoạt động? Và một câu hỏi hay hơn: tại sao nó làm cho mọi lần truy cập không hợp lệ (hay còn gọi là không có gì phù hợp)?

CHỈNH SỬA: đầu ra xxd từ đoạn mã curl ở trên

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..Vâng, cái này tôi
00000030: 7320 6869 6d2e 0d0a 5765 2067 6f74 2068 s anh ấy...Chúng tôi có 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..Vậy, h
00000070:6f77 206c 6f6e 670d 0a79 6f75 2062 6565 ow dài..anh ong
00000080: 6e20 696e 2053 6f75 7468 2046 6c6f 7269 n ở Nam 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
000000c0: 6c65 2e0d 0a42 6566 6f72 6520 7468 6174 le...Trước đó
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..Chúng tôi biết
00000100: 2079 6f75 2772 6520 4272 6961 6e20 4f27 bạn là Brian O'
00000110: 436f 6e6e 6572 2c0d 0a66 6f72 6d65 726c Conner,..formerl
00000120: 7920 6f66 2074 6865 204c 4150 442e 0d0a y của 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..- Bạn có
00000160: 7468 6520 7772 6f6e 6720 6775 792e 0d0a nhầm thằng...
00000170: 2d20 5265 616c 6c79 3f0d 0a0d 0a31 3132 - Thật sao?....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 . Bạn khỏe không,
000001b0: 4f27 436f 6e6e 6572 3f0d 0a O'Conner?..
lá cờ hr
CRLF đầu ra curl có bị chấm dứt thay vì LF không? thử `grep -Po "^\d+\r$"`
Cas avatar
lá cờ in
Cas
@steeldriver nó có phản hồi nhưng tất cả đều là dòng trống. Vì vậy, `^\d+$` không mang lại gì. `^\d+` cho kết quả nhưng không như tôi muốn. `^\d+\r$` cho rất nhiều dòng trống. Có thể so sánh với `printf "\n\n\n\n\n\n etc.etc."`
lá cờ hr
Chà, thật khó để chẩn đoán nếu không nhìn thấy đầu ra curl thực tế - bạn có thể chuyển một phần nhỏ thành `cat -A` hoặc `xxd` và [chỉnh sửa] nó vào câu hỏi của bạn để chúng tôi có thể xem nó theo từng byte không?
Cas avatar
lá cờ in
Cas
Khi chuyển sang cat -A, tôi chỉ thấy mọi thứ bình thường ngoài thực tế là mọi thứ kết thúc bằng ^M$
lá cờ hr
Được rồi, vấn đề **là** ký tự xuống dòng trả về (đó là những gì mà `^M` đại diện) tuy nhiên đầu ra `grep -Po` sẽ bị rối nếu bạn chỉ khớp với phần cuối `\r$` như tôi đã đề xuất ban đầu (tôi không biết tại sao - bạn có thể xác nhận rằng nó xuất ra đúng thứ bằng cách chuyển đầu ra grep qua `cat -A`)
lá cờ hr
... OK, có vẻ như có sự tương tác giữa `\r` và mã màu - nó hoạt động với tôi nếu tôi sử dụng `grep --color=never -Po "^\d+\r$"`.Tuy nhiên, một giải pháp tốt hơn có lẽ là chuyển đổi đầu ra curl thành các kết thúc dòng `LF` kiểu Unix.
Cas avatar
lá cờ in
Cas
`grep --color=never -Po "^\d+$"` đã hoạt động. Tuy nhiên, tôi nghĩ nên có một giải pháp dễ dàng hơn phải không? Tôi có thể làm gì với lệnh curl để thay đổi đầu ra ở đó không? Hoặc chuyển đầu ra thông qua một lệnh và sau đó, mọi thứ sẽ hoạt động bình thường? Hay đây thực sự là nó?
Điểm:0
lá cờ hr

Đầu ra lệnh curl của bạn có các kết thúc dòng CRLF kiểu DOS - vì vậy các dòng bạn đang tìm kiếm không kết thúc bằng \d+, chúng kết thúc bằng \d+\r

Bạn có thể thay đổi lệnh grep của mình thành grep -Po "^\d+\r$" - điều này sẽ khớp với những gì bạn đang tìm kiếm, nhưng đầu ra sẽ bao gồm các ký tự xuống dòng. Với đầu ra màu (tức là khi tiếng kêu được đặt bí danh cho grep --color=auto và đầu ra đi đến một thiết bị đầu cuối), CR làm cho đầu ra bị ghi đè bởi các ký tự mã màu để nó có vẻ trống. Nếu bạn đang định tuyến hoặc chuyển hướng đầu ra, thì đây có thể không phải là vấn đề. Nếu không, một số tùy chọn là:

  • chuyển đầu ra curl qua tr để loại bỏ vận chuyển trở lại ex.

     quăn... | tr -d '\r' | grep -Po "^\d+$"
    
  • thay đổi RE để khớp nhưng không bao gồm CR bằng Perl nhìn thẳng

     quăn... | grep -Po "^\d+(?=\r$)"
    

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.