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, 'времена' и 4?

Я попробовал awk, но существуют круглые скобки, балансирующие проблемы

3
задан 5 April 2018 в 19:42

2 ответа

Если вы хотите извлечь значения без скобок атрибута SEM , то вы можете сделать это, используя grep в режиме PCRE:

$ grep -Po '(?<=\[SEM=)[^()]*?(?=\])' file
50
'times'
4

или perl Сам

$ perl -lne 'print $1 if /(?<=\[SEM=)([^()]*?)(?=\])/' file
50
'times'
4

Оба подхода используют регулярное выражение lookarounds .

5
ответ дан 1 December 2019 в 13:15

С некоторыми 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
3
ответ дан 1 December 2019 в 13:15

Другие вопросы по тегам:

Похожие вопросы: