Capture valores entre colchetes duplos

1

Eu tenho dados em um arquivo como {{1,department}} .

Eu preciso capturar os valores conforme abaixo:

val1=1
val2=department

Eu tentei o comando awk para dados com {} único, funcionou. mas para o dobro {{}} o comando não está funcionando.

o comando que eu usei é:

'var1='echo $line | awk -F '[{}]' '{print $2}' | awk -F '[,]' '{print $1}'
    
por akr 01.08.2018 / 07:59

3 respostas

1
$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1
    
por 01.08.2018 / 08:24
3

Com GNU grep e qualquer shell POSIX:

out=$(grep -Po '\{\{\K.*?(?=\}\})' < your-file)
val1=${out%%,*}
val2=${out#*,}
  • -P : informa grep para usar expressões regulares compatíveis com perl para seus \K e (?=) operadores
  • \K : define o início do valor retornado . a\Kb corresponde a ab , mas retorna b . Então, aqui, combinamos em {{... , mas só retornamos ... para excluir {{ da saída.
  • (?=...) alcança a mesma coisa para }} . É um operador de look-ahead que corresponde a 0 width se ... corresponder a ele sem que ... seja incluído no valor retornado
  • , então $out acaba com 1,department . Usamos os operadores de shell padrão ${var%%pattern} e ${var#pattern} para extrair a peça antes e depois da primeira vírgula.

Isso pressupõe que o arquivo contenha apenas uma ocorrência de {{...}} e que contenha pelo menos uma vírgula.

POSIXly, você pode substituir o comando grep por:

sed -n 's/.*{{\([^}]*\)}}.*//p'

Agora, se você tiver

some text {{1,department}} other text

em uma variável shell, você também pode extraí-lo com:

  • zsh

    if [[ $string =~ '\{\{([^},]*),([^}]*)\}\}' ]]; then
      val1=$match[1] val2=$match[2]
    fi
    
  • bash

    if [[ $string =~ \{\{([^},]*),([^}]*)\}\} ]]; then
      val1=${BASH_REMATCH[1]} val2=${BASH_REMATCH[2]}
    fi
    
por 01.08.2018 / 08:13
1

Você pode imprimir os valores (com um espaço à esquerda) com:

$ echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF'
 1 department

Isso permitirá que você leia os valores:

read val1 val2 <<<$(echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF')

Isso funcionará para um colchete e outros campos adicionais:

$ echo "{{1,department,name,list}}" | awk -F '[ {},]' 'NF=NF'
 1 department name list

Uma solução semelhante é possível com o grep:

$ echo '{1,department}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department,name,list}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
name
list

De uma variável no shell, ela precisa corresponder ao número exato de campos:

$ value='{{1,department}}'
$ re='\{\{([^},]*),([^}]*)\}\}'
$ [[ $value =~ $re ]] && echo "${BASH_REMATCH[@]:1}"
1 department
    
por 02.08.2018 / 11:38

Tags