Ваш шаблон 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 |
-разделенные поля и выведите номер строки, :
и саму строку.