Score:0

เมื่อวาง grep หลังจากคำขอ curl regex จะทำงานแปลกมาก

ธง in
Cas

ปัญหาง่ายๆ แต่แปลกจริงๆ

เมื่อฉันทำการขอขดและทำ ... | grep -Po "^\d+$"โดยไม่คืนค่าใดๆ แม้ว่าจะมีผลลัพธ์มากกว่า 400 รายการที่ควรตรงกัน ดูด้านล่าง:

ตัวอย่าง #example ของเอาต์พุต curl
107
00:15:54,936 --> 00:15:56,646
ใช่ นี่คือเขา
เราได้เขา

108
00:16:07,823 --> 00:16:11,869
ดังนั้นนานแค่ไหน
คุณเคยอยู่ที่ฟลอริดาตอนใต้ไหม

109
00:16:11,953 --> 00:16:13,871
สักพัก.
ก่อนหน้านั้น?

110
00:16:17,166 --> 00:16:20,253
เรารู้ว่าคุณคือไบรอัน โอคอนเนอร์
เดิมของ LAPD

111
00:16:21,128 --> 00:16:23,214
- คุณจับผิดคนแล้ว
- จริงๆ?

112
00:16:28,177 --> 00:16:29,929
คุณเป็นอย่างไรบ้าง โอคอนเนอร์?

นั่นคือส่วนหนึ่งของเอาต์พุตขด เอาต์พุตที่สมบูรณ์ไปที่ 1,000+ ในกรณีนี้ (ที่นี่ 107-112) ตอนนี้:

$ [ขอขด] | grep -Po "^\d+$"
[ตอบเปล่า]

$ [ขอขด] | grep -Po "^\d+"
[อึตันของผลลัพธ์]

และฉันไม่เข้าใจเลยจริงๆ ฉันยังพยายามเพิ่ม -ก เพื่อ grep แต่นั่นก็ไม่ได้ช่วยอะไร

ทำไม $ ไม่ทำงาน และคำถามที่ดีกว่า: เหตุใดการเข้าชมทุกครั้งจึงไม่ถูกต้อง (หรือที่ไม่มีอะไรตรงกัน)

แก้ไข: เอาต์พุต xxd จากข้อมูลโค้ด curl ด้านบน

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..ใช่ฉัน
00000030: 7320 6869 6d2e 0d0a 5765 2067 6f74 2068 s เขา...เราได้ 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..ซ.
00000070: 6f77 206c 6f6e 670d 0a79 6f75 2062 6565 ยาวไป..คุณผึ้ง
00000080: 6e20 696e 2053 6f75 7468 2046 6c6f 7269 n ใน South Flori
00000090: 6461 3f0d 0a0d 0a31 3039 0d0a 3030 3a31 ดา?....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..เดี๋ยว
000000c0: 6c65 2e0d 0a42 6566 6f72 6520 7468 6174 le...ก่อนหน้านั้น
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..เรารู้
00000100: 2079 6f75 2772 6520 4272 6961 6e20 4f27 คุณคือ Brian O'
00000110: 436f 6e6e 6572 2c0d 0a66 6f72 6d65 726c Conner,..formerl
00000120: 7920 6f66 2074 6865 204c 4150 442e 0d0a y ของ 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..- คุณได้
00000160: 7468 6520 7772 6f6e 6720 6775 792e 0d0a คนผิด...
00000170: 2d20 5265 616c 6c79 3f0d 0a0d 0a31 3132 - จริงเหรอ....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 เป็นไงบ้าง
000001b0: 4f27 436f 6e6e 6572 3f0d 0a โอคอนเนอร์?..
hr flag
CRLF เอาต์พุต curl ถูกยกเลิกแทนที่จะเป็น LF หรือไม่ ลอง `grep -Po "^\d+\r$"`
Cas avatar
in flag
Cas
@steeldriver มันให้การตอบสนอง แต่เป็นบรรทัดว่างทั้งหมด ดังนั้น `^\d+$` จึงไม่ได้อะไรเลย `^\d+` ให้ผลลัพธ์ แต่ไม่ใช่สิ่งที่ฉันต้องการ `^\d+\r$` ให้บรรทัดว่างจำนวนมาก เทียบได้กับ `printf "\n\n\n\n\n\n etc.etc."`
hr flag
เป็นการยากที่จะวินิจฉัยโดยไม่เห็นผลลัพธ์ของ curl จริง - คุณสามารถไพพ์ส่วนเล็ก ๆ เป็น `cat -A` หรือ `xxd` และ [แก้ไข] ลงในคำถามของคุณเพื่อให้เรามองเห็นทีละไบต์ได้หรือไม่
Cas avatar
in flag
Cas
เมื่อทำการไพพ์ไปที่ cat -A ฉันเห็นทุกอย่างเป็นปกติยกเว้นข้อเท็จจริงที่ว่าทุกอย่างลงท้ายด้วย ^M$
hr flag
ตกลง ดังนั้นปัญหา **คือ** การขึ้นบรรทัดใหม่ (นั่นคือสิ่งที่ `^M` แสดงถึง) อย่างไรก็ตาม เอาต์พุต `grep -Po` จะยุ่งเหยิงหากคุณเพียงแค่จับคู่ตอนจบ `\r$` ตามที่ฉันแนะนำในตอนแรก (I ไม่รู้ว่าทำไม - คุณสามารถยืนยันได้ว่ามันกำลังส่งออกสิ่งที่ถูกต้องโดยการไพพ์เอาต์พุต grep ผ่าน `cat -A`)
hr flag
... ตกลง ดังนั้นดูเหมือนว่ามีการโต้ตอบระหว่าง `\r` และรหัสสี - มันใช้ได้สำหรับฉันถ้าฉันใช้ `grep --color=never -Po "^\d+\r$"`อย่างไรก็ตาม ทางออกที่ดีกว่าน่าจะเป็นการแปลงเอาต์พุต curl เป็นการลงท้ายบรรทัด `LF` สไตล์ Unix
Cas avatar
in flag
Cas
`grep --color=never -Po "^\d+$"` ใช้งานได้ อย่างไรก็ตาม ฉันคิดว่าน่าจะมีวิธีแก้ปัญหาที่ง่ายกว่านี้ใช่ไหม? ไม่มีสิ่งที่ฉันสามารถทำได้ที่คำสั่ง curl เพื่อแก้ไขผลลัพธ์ที่นั่นใช่ไหม หรือไพพ์เอาต์พุตผ่านคำสั่งหลังจากนั้นทุกอย่างจะทำงานได้ตามปกติ? หรือนี่คือความจริง?
Score:0
ธง hr

เอาต์พุตคำสั่ง curl ของคุณมีการลงท้ายบรรทัด CRLF แบบ DOS ดังนั้นบรรทัดที่คุณต้องการจะไม่ลงท้ายด้วย \d+, พวกเขาลงท้ายด้วย \d+\r

คุณสามารถเปลี่ยนคำสั่ง grep เป็น grep -Po "^\d+\r$" - สิ่งนี้จะตรงกับสิ่งที่คุณกำลังมองหา แต่ผลลัพธ์จะรวมอักขระการขึ้นบรรทัดใหม่ ด้วยเอาต์พุตสี (เช่น เมื่อ เกรป มีนามแฝงว่า grep --color=auto และเอาต์พุตไปที่เทอร์มินัล) CR ทำให้เอาต์พุตถูกพิมพ์ทับด้วยอักขระรหัสสีเพื่อให้ว่างเปล่า หากคุณกำลังไพพ์หรือเปลี่ยนทิศทางเอาต์พุต นี่อาจไม่ใช่ปัญหา มิฉะนั้นบางตัวเลือกคือ:

  • ท่อส่งขดผ่าน เพื่อลบการขึ้นบรรทัดใหม่เช่น

     ขด ... | tr -d '\r' | grep -Po "^\d+$"
    
  • เปลี่ยน RE ให้ตรงกัน แต่ไม่รวม CR โดยใช้ Perl มองไปข้างหน้า

     ขด ... | grep -Po "^\d+(?=\r$)"
    

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา