Bash:从文件获取值

Bash:从文件获取值

我有一个像这样构建的文件:

(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属性的非括号值然后你就可以使用grepPCRE 模式来执行此操作:

$ 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

相关内容