我有一个大文件,其中包含特定语言的所有词素的表面形式。我只想提取动词变位模式,特别是现在时的第一,第二,第三人称单数和复数。
我使用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
答案 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]
相同。