格雷普正则表达式单行?



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

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

regex: Vm-pd.+(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-pd.+e" input.txt >> sr_verbs.txt
$ grep -P "Vm-pd.+p" input.txt >> sr_verbs.txt

更新:正如@kevinji指出的那样,我最初的正则表达式应该与 -P 选项一起使用。 我今天又试了一次,它做到了。好吧,我想我不确定我到底做了什么。 无论如何,这工作正常。

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

使用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

您需要使用括号来使用所谓的正则表达式"字符类",这意味着"此处包含的任何字符之一":

grep -P 'Vm-pd.+[ep]'

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

我有点惊讶(e|p)对你不起作用; 事实上,(?:e|p)(非捕获组)应该与[ep]相同。

相关内容

  • 没有找到相关文章

最新更新