регулярное выражение для сопоставления строк с точно n раз трубы - PullRequest
0 голосов
/ 11 июня 2018

Я использую grep для сопоставления строк, которые имеют ровно 52 конвейера (|).Я использую команду grep:

grep -nP "^(.*?\|){52}"

-P, поскольку модификатор lazy ? не работает иначе.Когда я запускаю это, отображается следующее сообщение: PCRE's backtracking limit is exceeded.Я думаю, что-то не так с Perl-подобным регулярным выражением здесь.

  • Не хватает ли памяти?
  • Проблема в регулярном выражении, которое я использую?
  • Есть ли лучшее регулярное выражение, которое я могу использовать?

Большое спасибо!

1 Ответ

0 голосов
/ 11 июня 2018

Ваш шаблон PCRE (который соответствует только 52 вхождениям любых 0+ символов, как можно меньше, вплоть до символа | включительно, и не проверяет какой-либо текст кроме этого) содержит группу повторных захватов, когда двигательсовпадений, он также помещает каждый 0+ символов перед каждым | и | char в группу, а затем перезаписывает значение при каждой итерации.В некоторых реализациях это приводит к предоставленной вами ошибке.

Обратите внимание, что вам не нужно регулярное выражение PCRE для этой задачи, поскольку для сопоставления с любым символом, но | вы можете использовать [^|], а затем использовать простую POSIX ERE.шаблон (активируется с опцией -E) с grep:

grep -En "^([^|]*\|){52}[^|]*$"

Обратите внимание на [^|]*$, добавленное в конце.Он соответствует любым 0+ символам, отличным от |, и затем устанавливает конец строки.Таким образом, сопоставляются только строки, содержащие 53 | -разделенные поля.

Иначе, вы можете рассмотреть решение awk (как рекомендует PS):

awk -F'|' '{if (NF==53) {print NR ":" $0;}}'

, где мы проверяем на 53 | -разделенные поля и выведите номер строки, : и саму строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...