grep regex单线吗?

时间:2019-03-23 15:53:06

标签: regex grep

我有一个大文件,其中包含特定语言的所有词素的表面形式。我只想提取动词变位模式,特别是现在时的第一,第二,第三人称单数和复数。

我使用this在线工具测试了以下正则表达式,它可以正确识别我要提取的行。

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

下面是* match *行的文件外观示例:

сломе                   сломити               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 个答案:

答案 0 :(得分:3)

使用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 :(得分:1)

您将希望通过使用方括号来使用正则表达式“字符类”,这意味着“此处包含的任何字符之一”:

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

请注意,[e|p]实际上略有不同;它与字符e|p匹配。

(e|p)对您不起作用令我感到有些惊讶;实际上,(?:e|p)(非捕获组)应该与[ep]相同。