Рейтинг:0

При передаче grep после запроса на завивание регулярное выражение работает очень странно

флаг in
Cas

Простая проблема, но очень странная.

Когда я делаю запрос на завивку и делаю ... | grep -Po "^\d+$", он ничего не возвращает, хотя должно совпадать более 400 результатов. Смотри ниже:

#пример фрагмента вывода 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
Мы знаем, что вы Брайан О'Коннер,
ранее из полиции Лос-Анджелеса.

111
00:16:21,128 --> 00:16:23,214
- Вы ошиблись парнем.
- Действительно?

112
00:16:28,177 --> 00:16:29,929
Как дела, О'Коннер?

Так что это часть вывода curl. В этом случае полный вывод достигает 1000+ (здесь 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 с ним... Мы получили ч
00000040: 696d 2e0d 0a0d 0a31 3038 0d0a 3030 3a31 им.....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 в Южной Флориде
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..A бе
000000c0: 6c65 2e0d 0a42 6566 6f72 6520 7468 6174 ле... До этого
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 ты Брайан О'
00000110: 436f 6e6e 6572 2c0d 0a66 6f72 6d65 726c Коннер,..бывш.
00000120: 7920 6f66 2074 6865 204c 4150 442e 0d0a y полиции Лос-Анджелеса...
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
Завершается ли вывод curl CRLF, а не LF? попробуйте `grep -Po "^\d+\r$"`
Cas avatar
флаг in
Cas
@steeldriver дает ответ, но все это пустые строки. Так что `^\d+$` ничего не дает. `^\d+` дает результаты, но не то, что я хочу. `^\d+\r$` дает много пустых строк. Сопоставимо с `printf "\n\n\n\n\n\n и т. д. и т. д."`
флаг hr
Что ж, трудно диагностировать, не видя фактического вывода curl - можете ли вы передать небольшой раздел в `cat -A` или `xxd` и [отредактировать] его в своем вопросе, чтобы мы могли видеть его байт за байтом?
Cas avatar
флаг in
Cas
При подключении к cat -A я просто вижу все нормально, кроме того факта, что все заканчивается на ^M$
флаг hr
Итак, проблема ** заключается в ** возврате каретки (это то, что представляет `^M`), однако вывод `grep -Po` искажается, если вы просто сопоставляете окончание `\r$`, как я первоначально предложил (я не знаю почему - вы можете подтвердить, что он выводит правильные вещи, направив вывод grep через `cat -A`)
флаг hr
... Итак, кажется, что есть взаимодействие между `\ r` и цветовыми кодами - это работает для меня, если я использую `grep --color=never -Po "^\d+\r$"`.Однако лучшим решением, вероятно, является преобразование вывода curl в окончание строки `LF` в стиле Unix.
Cas avatar
флаг in
Cas
`grep --color=never -Po "^\d+$"` сработало. Однако я думаю, что должно быть более простое решение, верно? Разве я не могу что-то сделать с помощью команды curl, чтобы изменить вывод? Или передать вывод через команду, и после этого все будет работать нормально? Или это действительно так?
Рейтинг:0
флаг hr

Выходные данные вашей команды curl имеют окончания строк CRLF в стиле DOS, поэтому строки, которые вы ищете, не заканчиваются на \д+, они заканчиваются \д+\г

Вы можете изменить команду grep на grep -Po "^\d+\r$" - это будет соответствовать тому, что вы ищете, но вывод будет включать символы возврата каретки. При цветном выводе (т.е. когда grep псевдоним grep --color=авто и вывод идет на терминал) CR приводит к тому, что вывод заменяется символами цветового кода, так что он выглядит пустым. Если вы передаете или перенаправляете вывод, это может не быть проблемой. В противном случае некоторые варианты:

  • передать вывод curl через тр чтобы удалить возврат каретки ex.

     завиток ... | тр -д '\г' | grep -Po "^\d+$"
    
  • измените RE, чтобы он соответствовал, но не включал CR, используя Perl смотреть вперед

     завиток ... | grep -Po "^\d+(?=\r$)"
    

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.