$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department
$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
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}'
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 $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
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