Corresponder chaves com regex em jq [closed]

1

Estou escrevendo um script que analisa a entrada JSON ( jsonfile ):

  {
   "key11":1010,"key11_yes":13,"key11_no":14,
   "key12":12120,"key12_yes":9,"key12_no":25,
   "key13":12103,"key13_yes":13,"key13_no":20
  }

Eu quero usar jq tools e verificar os valores de key11 , key12 , key13 assim:

cat jsonfile | jq 'key[1-9][1-9]'

Eu quero que o padrão funcione como grep -style regex:

cat jsonfile | grep 'key[1-9][1-9]'

Se uma chave correspondente tiver o valor null, meu script deverá exit 0 .

Além disso, preciso verificar o segundo parâmetro se key[1-9]_[this part is null] (ou seja, sem _yes ou _no anexado) e, em seguida, exit 0 .

    
por pyramid13 15.05.2018 / 11:12

1 resposta

3

jq de filtros de expressões regulares ( test , match , capture ) pegue texto bruto como sua entrada. Para aplicar um regex a nomes de chaves, você primeiro terá que converter esses nomes de chave em texto.

jq fornece uma função to_entries para isso:

cat jsonfile | jq 'to_entries'

saída:

[
  {
    "key": "key11",
    "value": 1010
  },
  {
    "key": "key11_yes",
    "value": 13
  },
  {
    "key": "key11_no",
    "value": 14
  },
  {
    "key": "key12",
    "value": 12120
  },
...
]

Isso pode ser alimentado em um filtro que extrai a chave, testa-a em um regexp e, em seguida, exibe a entrada inteira ou a omite:

if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end

A função from_entries correspondente pode converter as entradas restantes de volta ao seu formato original ou with_entries pode fazer tudo em uma etapa:

cat jsonfile|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )'

O resultado é todos os pares da entrada cujas chaves correspondem ao padrão:

{
  "key11": 1010,
  "key12": 12120,
  "key13": 12103
}
    
por 15.05.2018 / 15:46