我有一个大文件,其中包含特定语言中所有表面形式的词素。 我只想提取动词屈折模式,特别是现在时的第一、第二、第三人称单数和复数。
我使用此在线工具测试了以下正则表达式,它正确识别了我尝试提取的行。
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]
相同。