2017-09-14 7 views
1

J'ai une configuration avec le contenu à échanger avec des extraits de fichier séparé. Comment pourrais-je réaliser cela?Remplacer l'élément de tableau dans le hachage JSON avec le contenu d'un autre fichier

fichier de configuration pourrait ressembler à:

# config file 
{ 
    "keep": "whatever type of value", 
    "manipulate": [ 
     { 
      "foo": "bar", 
      "cat": { 
       "color": "grey" 
      }, 
      "type": "keep", 
      "detail": "keep whole array element" 
     }, 
     { 
      "stuff": "obsolete", 
      "more_stuff": "obsolete", 
      "type": "replace", 
      "detail": "replace whole array element with content from separate file" 
     }, 
     { 
      "foz": "baz", 
      "dog": { 
       "color": "brown" 
      }, 
      "type": "keep", 
      "detail": "keep whole array element" 
     }, 

    ], 
    "also_keep": "whatever type of value" 
} 

Le contenu (provenant de fichier séparé) à insérer en remplacement de obsolète élément de tableau:

# replacement 
{ 
    "stuff": "i want that", 
    "fancy": "very", 
    "type": "new" 
} 

Le résultat souhaité devrait ressembler à:

# result 
{ 
    "keep": "whatever kind of value", 
    "manipulate": [ 
     { 
      "foo": "bar", 
      "cat": { 
       "color": "grey" 
      }, 
      "type": "keep", 
      "detail": "keep whole array element" 
     }, 
     { 
      "stuff": "i want that", 
      "fancy": "very", 
      "type": "new" 
     }, 
     { 
      "foz": "baz", 
      "dog": { 
       "color": "brown" 
      }, 
      "type": "keep", 
      "detail": "keep whole array element" 
     }, 

    ], 
    "also_keep": "whatever kind of value", 
} 

Exigences:

  • remplacement de contenu doit se faire en fonction de la valeur de type clé.
  • Utilisez de préférence jq et les outils bash/linux courants.
  • commande élément Array doit rester même
+0

Vous devez expliquer comment ce remplacement fonctionne, car il est pas évident pour moi comment vous avez obtenu « résultat » de « fichier de configuration ". Ce n'est pas un simple remplacement. – Stalinko

+0

@Stalinko Vous avez peut-être manqué la 2ème section _ # replacement_? Et, oui, la question est, comment obtenir (_ # result_) de l'entrée originale (_ # configfile_) en utilisant snippet _ # replacement_ – ITL

Répondre

1

JQ solution:

jq --slurpfile repl repl.json '.manipulate=[.manipulate[] 
    | if .type=="replace" then .=$repl[0] else . end]' config.json 
  • repl.json - fichier JSON contenant des données JSON de remplacement

  • --slurpfile repl repl.json - lit tous les textes JSON dans le fichier nommé et lie un tableau du JSON analysé v aleurs à la variable globale donnée

La sortie:

{ 
    "keep": "whatever type of value", 
    "manipulate": [ 
    { 
     "foo": "bar", 
     "cat": { 
     "color": "grey" 
     }, 
     "type": "keep", 
     "detail": "keep whole array element" 
    }, 
    { 
     "stuff": "i want that", 
     "fancy": "very", 
     "type": "new" 
    }, 
    { 
     "foz": "baz", 
     "dog": { 
     "color": "brown" 
     }, 
     "type": "keep", 
     "detail": "keep whole array element" 
    } 
    ], 
    "also_keep": "whatever type of value" 
} 
+0

Thx, vous avez fait ma journée .. Fonctionne parfaitement – ITL

+0

@ITL, je vous en prie – RomanPerekhrest

1
jq --slurpfile repl repl.json '.manipulate |= 
    map(if .type=="replace" then $repl[0] else . end)' config.json