我有一个像这样构建的文件:
(MATH[NUMBER1=(50, unknown, unknown), NUMBER2=(unknown, 4, unknown), OPERATOR='times']
(NUM[SEM=(50, unknown, unknown)] (DIZAINE[SEM=50] cinquante))
(OPERATEUR[SEM='times'] multiplie)
(NUM[SEM=(unknown, 4, unknown)] (UNITE[SEM=4] quatre)))
我如何提取值 50、'times' 和 4?
我尝试过使用 awk,但存在括号平衡问题
答案1
如果你想提取SEM
属性的非括号值然后你就可以使用grep
PCRE 模式来执行此操作:
$ grep -Po '(?<=\[SEM=)[^()]*?(?=\])' file
50
'times'
4
或perl
本身
$ perl -lne 'print $1 if /(?<=\[SEM=)([^()]*?)(?=\])/' file
50
'times'
4
两种方法都使用正则表达式环视。
答案2
利用一些re
模块命令,我们可以编写如下 Python 脚本:
#!/usr/bin/env python3
import sys,re
with open(sys.argv[1]) as fd:
for line in fd:
items = re.findall(r'SEM=[^(]+?\]',line)
for i in items:
tokens = filter( lambda x: x != 'SEM' and x, re.split('=|]',i) )
print("\n".join(tokens))
根据您给出的输入生成:
$ ./get_sem_vals.py ./input.txt
50
'times'
4
我还考虑了SEM
同一行中可能出现的多个值。如果我们将第二行修改为
(NUM[SEM=(50, unknown, unknown)] (DIZAINE[SEM=50] cinquante, ATHING=[SEM=25]))
该脚本产生以下输出:
$ ./get_sem_vals.py ./input.txt
50
25
'times'
4