Использование регулярных выражений в Grep для командной строки Windows - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу захватить все строки, которые содержат точно 3 поля, где поле - любая строка (возможно, пустая), за которой следует | (и в конце может быть какой-то окончательный текст line).

Мне удалось построить regex, который, кажется, делает именно то, что я хочу

^(?:[^\|]*\|){3}[^\|]*$

, и когда я пробую его на 101regex , кажется, работает просто отлично.

Однако у меня возникают проблемы с запуском этого regex в командной строке Windows через grep, и я думаю, это как-то связано с правильным экранированием.

Я пытался

grep -E '^^(?:[^^^\^|]*^\^|){3}[^^^\^|]*$' test.txt
grep -E '^^(?:[^^^|]*^|){3}[^^^|]*$' test.txt

, но ничего не помогло. Есть идеи?


Тестовый ввод

0|1|2|3
0|1|2|
|1|2|3
|1|2|
|1|2
|1|
0|1|2
0|1|
|1|2|3|4
|1|2|3|
0|1|2|3|4
0|1|2|3|

1 Ответ

1 голос
/ 15 апреля 2020

В grep, когда вы используете механизм регулярных выражений POSIX ERE, вам нужно избегать обратной косой черты в выражениях скобок и в группах без захвата:

grep -E "^([^|]*\|){3}[^|]*$" test.txt

Здесь [^\|] превращается в [^|] (поскольку выражения в скобках POSIX не обрабатывают экранированные символы как экранированные регулярные выражения) и (?: заменяется на (, т. е. группа была сделана с захватом, поскольку не захватывающие выражения не поддерживаются.

См. подтверждение рабочая:

enter image description here

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