web-dev-qa-db-fra.com

Noms de champ de correspondance de modèle avec jq

C'est une question très basique (probablement idiote) mais je n'arrive pas à la faire fonctionner ...

J'ai un fichier JSON avec cette structure:

{
    "data": {
        "what a burger": [1,2,3],
        "wap": [66],
        "the map": [11,20],
        "H. Incandenza": [1,1],
        "What a burger": [a,a,3]
    }
}

Je voudrais extraire les valeurs des champs dans data dont le "nom" correspond à un certain modèle. Par exemple, je voudrais extraire toutes les coïncidences insensibles à la casse de "quel hamburger" pour obtenir

[1,2,3],[a,a,3]

Ma conjecture serait quelque chose comme

jq '.data | match("what a burger";"i")'

mais cela se traduit par

jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string

À votre santé.

12
manu

Votre instruction ne fonctionne pas, car vous essayez d'alimenter l'objet de données en correspondance, mais la correspondance ne peut fonctionner que sur des chaînes.

L'expression suivante fera ce que vous voulez. Le to_entries convertit l'objet en un tableau de clés et de valeurs. Ensuite, nous parcourons ce tableau en utilisant map et select toutes les entrées où le .key (maintenant une chaîne) a un match. Enfin, nous imprimons simplement la valeur de chaque élément.

.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)

Cependant, deux commentaires:

  • Le [a,a,3] n'est pas autorisé dans JSON, car a n'est pas un nombre.
  • Cela fonctionne parce que les clés SONT réellement différentes, même si seule la casse des lettres n'est pas égale. Si au moins deux clés sont identiques, vous rencontrerez des problèmes, car les clés doivent être uniques. En fait, jq ne produira alors qu'un seul des éléments.
7
koalo

Voici une alternative légèrement plus brève:

.data | with_entries(select(.key|match("what a burger";"i")))[]

Après avoir rectifié l'entrée et utilisé l'option -c de jq, cela produirait les deux lignes:

[1,2,3]
["a","a",3]
8
peak