Bash: obtendo valores do arquivo

3

Eu tenho um arquivo que é construído assim:

(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)))

Como posso extrair os valores 50, 'times' & 4?

Eu tentei com o awk, mas há problemas de equilíbrio entre parênteses

    
por Jessica Chambers 05.04.2018 / 18:42

2 respostas

5

Se você quiser extrair os valores sem parêntesis do atributo SEM , poderá fazê-lo usando grep no modo PCRE:

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

ou perl em si

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

Ambas as abordagens usam expressão regular lookarounds .

    
por steeldriver 05.04.2018 / 19:38
3

Com alguns comandos do módulo re , podemos montar um script Python da seguinte forma:

#!/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))

Com sua entrada específica que produz:

$ ./get_sem_vals.py ./input.txt
50
'times'
4

Eu também tomei a liberdade para considerar possíveis valores múltiplos de SEM na mesma linha. Se modificarmos sua segunda linha como

 (NUM[SEM=(50, unknown, unknown)] (DIZAINE[SEM=50] cinquante, ATHING=[SEM=25]))

o script produz a seguinte saída:

$ ./get_sem_vals.py ./input.txt
50
25
'times'
4
    
por Sergiy Kolodyazhnyy 05.04.2018 / 20:04