grep regex one-liner? - PullRequest
       4

grep regex one-liner?

0 голосов
/ 23 марта 2019

У меня есть большой файл, который содержит все поверхностные формы лексем на определенном языке. Я хотел извлечь только изгибные шаблоны глагола, в частности 1, 2, 3-го лица единственного и множественного числа в настоящем времени.

Я протестировал следующее регулярное выражение, используя этот онлайн-инструмент, и он правильно определяет строки, которые я пытаюсь извлечь.

regex: Vm-p\d.+(e|p)

Ниже приведен пример того, как файл выглядит со строками, которые * соответствуют *:

сломе                   сломити               Vm-p3p-an-n---e *match*
сломи                   сломити               Vmmp2s-an-n---e
сломи                   сломити               Vm-p3s-an-n---e *match*
сломивши                сломити               Rvp
сломиле                 сломити               Vmps-pfan-n---e
сломим                  сломити               Vm-p1s-an-n---e *match*
сломимо                 сломити               Vm-p1p-an-n---e *match*
сломите                 сломити               Vm-p2p-an-n---e *match*
сломићеш                сломити               Vmif2s-an-n---e
сломиш                  сломити               Vm-p2s-an-n---e *match*
иде                     ићи                   Vmia2s-an-n---p
иде                     ићи                   Vm-p3s-an-n---p *match*
идем                    ићи                   Vm-p1s-an-n---p *match*
идемо                   ићи                   Vm-p1p-an-n---p *match*
идео                    ићи                   Vmps-sman-n---p
идете                   ићи                   Vm-p2p-an-n---p *match*
идеш                    ићи                   Vm-p2s-an-n---p *match*
идоше                   ићи                   Vmia3p-an-n---p
иду                     ићи                   Vm-p3p-an-n---p *match*
идући                   ићи                   Rvp
иђасте                  ићи                   Vmii2p-an-n---p
иђаху                   ићи                   Vmii3p-an-n---p
иђаше                   ићи                   Vmii2s-an-n---p
ићи                     ићи                   Vmn----an-n---p
ишавши                  ићи                   Rvp

Однако, когда я пытаюсь использовать grep в командной строке, я могу заставить работать только его части, но не все вместе. Есть ли способ лучше? Я не смог найти хорошую ссылку в Интернете. Я ожидаю, что я буду искать другие шаблоны помимо этого.

Что я пробовал? Это работает, но как я могу их объединить?

$ grep -P "Vm-p\d.+e" input.txt >> sr_verbs.txt
$ grep -P "Vm-p\d.+p" input.txt >> sr_verbs.txt

Обновление: Как указывал @kevinji, мое оригинальное регулярное выражение должно было работать с опцией -P. Я попробовал это снова сегодня, и это сделало. Ну, я думаю, я не совсем уверен, что я сделал. Во всяком случае, это работает нормально.

$ grep -P "Vm-p\d.+(e|p)" input.txt

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

Легче обращаться с awk:

awk '$3 ~ /^Vm-p[0-9]+.+[ep]/' file

сломе                   сломити               Vm-p3p-an-n---e *match*
сломи                   сломити               Vm-p3s-an-n---e *match*
сломим                  сломити               Vm-p1s-an-n---e *match*
сломимо                 сломити               Vm-p1p-an-n---e *match*
сломите                 сломити               Vm-p2p-an-n---e *match*
сломиш                  сломити               Vm-p2s-an-n---e *match*
иде                     ићи                   Vm-p3s-an-n---p *match*
идем                    ићи                   Vm-p1s-an-n---p *match*
идемо                   ићи                   Vm-p1p-an-n---p *match*
идете                   ићи                   Vm-p2p-an-n---p *match*
идеш                    ићи                   Vm-p2s-an-n---p *match*
иду                     ићи                   Vm-p3p-an-n---p *match*

С grep вы можете использовать:

grep -E '[[:blank:]]Vm-p[0-9]+.+[ep]' file
1 голос
/ 24 марта 2019

Вы захотите использовать то, что называется регулярным выражением «класс символов», используя скобки, что означает «один из любых содержащихся здесь символов»:

grep -P 'Vm-p\d.+[ep]'

Обратите внимание, что [e|p] фактически немного отличается; соответствует символам e, | или p.

Я немного удивлен, что (e|p) не работает для вас; на самом деле (?:e|p) (группа без захвата) должна быть идентична [ep].

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