Puncte:0

Când introduceți grep după o solicitare de curl, regex funcționează foarte ciudat

drapel in
Cas

Problemă simplă, dar cu adevărat ciudată.

Când fac o cerere de curl și fac ... | grep -Po "^\d+$", nu returnează nimic, deși există peste 400 de rezultate care ar trebui să se potrivească. Vezi mai jos:

#example fragment de curl output
107
00:15:54,936 --> 00:15:56,646
Da, acesta este el.
L-am prins.

108
00:16:07,823 --> 00:16:11,869
Deci, cât timp
Ai fost în Florida de Sud?

109
00:16:11,953 --> 00:16:13,871
Un timp.
Inainte de asta?

110
00:16:17,166 --> 00:16:20,253
Știm că ești Brian O'Conner,
fostul LAPD.

111
00:16:21,128 --> 00:16:23,214
- Ai greşit tipul.
- Într-adevăr?

112
00:16:28,177 --> 00:16:29,929
Ce mai faci, O'Conner?

Deci, aceasta este o parte din rezultatul curl. Ieșirea completă ajunge la 1000+ în acest caz (aici 107-112). Acum:

$ [cerere curl] | grep -Po "^\d+$"
[răspuns gol]

$ [cerere curl] | grep -Po "^\d+"
[o mulțime de rezultate]

Și chiar nu înțeleg. Am incercat si eu sa adaug -A a grep, dar nici asta nu a ajutat.

De ce nu funcționează $? Și o întrebare mai bună: de ce face fiecare hit invalid (alias nimic nu se potrivește)?

EDITAȚI | ×: ieșire xxd din fragmentul curl de mai sus

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..Da, asta i
00000030: 7320 6869 6d2e 0d0a 5765 2067 6f74 2068 s el...Avem 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..Deci, h
00000070: 6f77 206c 6f6e 670d 0a79 6f75 2062 6565 ow long..tu albină
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...Înainte de asta
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..Știm
00000100: 2079 6f75 2772 6520 4272 6961 6e20 4f27 tu ești Brian O'
00000110: 436f 6e6e 6572 2c0d 0a66 6f72 6d65 726c Conner,..formerl
00000120: 7920 6f66 2074 6865 204c 4150 442e 0d0a y al 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 ..- Ai primit
00000160: 7468 6520 7772 6f6e 6720 6775 792e 0d0a tipul greșit...
00000170: 2d20 5265 616c 6c79 3f0d 0a0d 0a31 3132 - Serios?....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 .Ce mai faci,
000001b0: 4f27 436f 6e6e 6572 3f0d 0a O'Conner?..
drapel hr
Ieșirea curl este CRLF terminată mai degrabă decât LF? încercați `grep -Po "^\d+\r$"`
Cas avatar
drapel in
Cas
@steeldriver dă un răspuns, dar toate sunt linii goale. Deci `^\d+$` nu dă nimic. `^\d+` dă rezultate, dar nu ceea ce vreau. `^\d+\r$` oferă o mulțime de linii goale. Comparabil cu `printf "\n\n\n\n\n\n etc.etc."`
drapel hr
Ei bine, este greu de diagnosticat fără a vedea rezultatul curl real - poți direcționa o mică secțiune către `cat -A` sau `xxd` și să o [editezi] în întrebarea ta, astfel încât să o putem vedea octet cu octet?
Cas avatar
drapel in
Cas
Când țin la cat -A, văd totul normal, în afară de faptul că totul se termină cu ^M$
drapel hr
OK, deci problema **este** căruciorul se întoarce (așa reprezintă `^M`), dar ieșirea `grep -Po` se încurcă dacă pur și simplu potriviți sfârșitul `\r$` așa cum am sugerat inițial (I nu știu de ce - puteți confirma că emite ceea ce este corect, transferând ieșirea grep prin `cat -A`)
drapel hr
... OK, așa că se pare că există o interacțiune între `\r` și codurile de culoare - funcționează pentru mine dacă folosesc `grep --color=never -Po "^\d+\r$"`.Cu toate acestea, o soluție mai bună este probabil să convertiți rezultatul curl la terminațiile de linie `LF` în stil Unix.
Cas avatar
drapel in
Cas
`grep --color=never -Po "^\d+$"` a funcționat. Cu toate acestea, cred că ar trebui să existe o soluție mai ușoară, nu? Nu există ceva ce aș putea face la comanda curl pentru a modifica rezultatul de acolo? Sau conductați ieșirea printr-o comandă și după aceea, totul va funcționa normal? Sau chiar asta este?
Puncte:0
drapel hr

Ieșirea comenzii curl are terminații de linie CRLF în stil DOS - astfel încât liniile pe care le căutați nu se termină cu \d+, se termină cu \d+\r

Puteți schimba comanda grep în grep -Po "^\d+\r$" - acest lucru se va potrivi cu ceea ce căutați, dar rezultatul va include caracterele de returnare a căruciorului. Cu ieșire colorată (adică când grep este alias la grep --color=auto iar ieșirea merge către un terminal) CR face ca ieșirea să fie supratipată de caractere de cod de culoare, astfel încât să pară goală. Dacă redirecționați sau redirecționați ieșirea, aceasta poate să nu fie o problemă. În caz contrar, unele opțiuni sunt:

  • conductează ieșirea curlului prin tr a scoate retururile de transport ex.

     buclă... | tr -d '\r' | grep -Po "^\d+$"
    
  • modificați RE pentru a se potrivi, dar nu includeți CR folosind un Perl priveste inainte

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

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.