Eu queria usar jq para obter um valor específico b
de dois caminhos possíveis ( e apenas esses dois ). Então, basicamente, eu queria dizer
jq '(path1 OR path2) | .b'
que deve funcionar se b
estiver em um dos dois caminhos path1
ou path2
. Se ambos os caminhos tiverem b
, o primeiro caminho terá precedência.
Por exemplo, ambos
echo '{"b":2}' | jq '.b'
echo '{"a": {"b":2}}' | jq '.a.b'
extrair b
em .
e .a
.
Posso de alguma forma dizer
echo ... | jq '(MAGIC).b'
para fazê-lo funcionar para ambas as entradas acima?
O que tentei até agora é usar o operador recursivo ..
:
jq '[..|.b?|values]|first'
Isso funciona em ambos:
echo '{"b":2}' | jq '[..|.b?|values]|first'
echo '{"a": {"b":2}}' | jq '..|.b?|values|first'
dar 2
. Mas não é específico o suficiente e também permite b
estar em qualquer lugar da árvore abaixo .
. Também é difícil de ler. Além disso, pode não funcionar se os dois caminhos não estiverem relacionados entre pais e filhos.
(Isto é com jq 1.7 no Ubuntu 24.04 LTS)
Isso extrairia o valor da
b
chave de nível superior, mas se esse valor estiver faltando,null
, oufalse
(ou seja, se o valor for falso em um contexto booleano), use ab
chave ema
.O texto acima seria curto e rápido se você soubesse que sua
b
chave de nível superior nunca corresponde a um valor booleano. Para uma abordagem mais geral, você precisaria testar a existência dab
chave em vez de testar seu valor:Isto extrairia o valor da
b
chave de nível superior, se existir, e caso contrário retornaria o valor da outra chave. Isso seria capaz de retornarfalse
ounull
para a chave de nível superiorb
se esse for o valor que a chave possui.Quanto à sua expressão "mágica", na forma exata que você pediu, ou seja
(MAGIC).b
:Aqui, a
if
instrução retorna.
ou.a
dependendo se ab
chave existe ou não no objeto atual. Ob
valor da chave é extraído de qualquer objeto que a expressão "mágica" retorne.