2017-07-12 3 views
2

Mon fichier d'entrée JSON se présente comme suit:contenu mise à jour de fichiers via JQ à l'aide de l'opérateur de redirection

{ 
"Name":"SA", 
"Password":"yyyyy", 
"Mappings" : { 
"RegionMap" : { 
    "us-east-1"  : { "AMI" : "xxxxxx" }, 
    "us-east-2"  : { "AMI" : "" }, 
    "us-west-1"  : { "AMI" : "" }, 
    "us-west-2"  : { "AMI" : "" }, 
    "ca-central-1" : { "AMI" : "" }, 
    "eu-central-1" : { "AMI" : "" }, 
    "eu-west-1"  : { "AMI" : "" }, 
    "eu-west-2"  : { "AMI" : "" }, 
    "ap-south-1"  : { "AMI" : "" }, 
    "ap-southeast-1" : { "AMI" : "" }, 
    "ap-southeast-2" : { "AMI" : "" }, 
    "ap-northeast-1" : { "AMI" : "" }, 
    "ap-northeast-2" : { "AMI" : "" }, 
    "sa-east-1"  : { "AMI" : "" }  
    } 
} 
} 

Ma tâche consiste à mettre à jour la valeur de la clé AMI de us-east-1 dans le fichier JSON donné et créer le fichier mis à jour comme nouveau fichier. J'utilise le plugin jq avec l'opérateur de redirection. Il a + opérateur qui peut être utilisé pour overwrite contenus dans un objet.

Ma sortie expected est

{ 
"Name":"SA", 
"Password":"yyyyy", 
"Mappings" : { 
"RegionMap" : { 
    "us-east-1"  : { "AMI" : "abcd" }, 
    "us-east-2"  : { "AMI" : "" }, 
    "us-west-1"  : { "AMI" : "" }, 
    "us-west-2"  : { "AMI" : "" }, 
    "ca-central-1" : { "AMI" : "" }, 
    "eu-central-1" : { "AMI" : "" }, 
    "eu-west-1"  : { "AMI" : "" }, 
    "eu-west-2"  : { "AMI" : "" }, 
    "ap-south-1"  : { "AMI" : "" }, 
    "ap-southeast-1" : { "AMI" : "" }, 
    "ap-southeast-2" : { "AMI" : "" }, 
    "ap-northeast-1" : { "AMI" : "" }, 
    "ap-northeast-2" : { "AMI" : "" }, 
    "sa-east-1"  : { "AMI" : "" }  
    } 
} 
} 

Ma commande actuelle ne fournit pas la sortie attendue et son comme suit:

jq '.Mappings.RegionMap + { "us-east-1":{"AMI":"abcd"}}' 
<OldfileName> > <Newfilename> 

quelqu'un peut me aider à atteindre les résultats attendus en utilisant l'opérateur de redirection? Je exécute la commande sur un environnement cygwin et ma version jq est 1.5.

EDIT

Ajout d'une virgule après le mot de passe clé

Répondre

2

La première question qui rend votre entrée JSON invalide est cette ligne (3ème ligne):

... 
"Password":"yyyyy" <---- 
... 

Il devrait être suivi par ,.

Après fixation, vous pouvez facilement mettre à jour la valeur de la propriété nécessaire:

jq '.Mappings.RegionMap["us-east-1"].AMI = "abcd"' oldfile > newfile 

newfile contenu:

{ 
    "Name": "SA", 
    "Password": "yyyyy", 
    "Mappings": { 
    "RegionMap": { 
     "us-east-1": { 
     "AMI": "abcd" 
     }, 
     "us-east-2": { 
     "AMI": "" 
     }, 
     "us-west-1": { 
     "AMI": "" 
     }, 
     "us-west-2": { 
     "AMI": "" 
     }, 
     "ca-central-1": { 
     "AMI": "" 
     }, 
     "eu-central-1": { 
     "AMI": "" 
     }, 
     "eu-west-1": { 
     "AMI": "" 
     }, 
     "eu-west-2": { 
     "AMI": "" 
     }, 
     "ap-south-1": { 
     "AMI": "" 
     }, 
     "ap-southeast-1": { 
     "AMI": "" 
     }, 
     "ap-southeast-2": { 
     "AMI": "" 
     }, 
     "ap-northeast-1": { 
     "AMI": "" 
     }, 
     "ap-northeast-2": { 
     "AMI": "" 
     }, 
     "sa-east-1": { 
     "AMI": "" 
     } 
    } 
    } 
} 
+0

@RomanPerekrest Merci. Ça a marché. Voir aussi mon édition – shubhamagiwal92

+0

@ shubhamagiwal92, vous êtes les bienvenus – RomanPerekhrest

+0

Pas un gros problème, mais j'utiliserais juste une simple affectation '=' dans ce cas puisque vous affectez une valeur fixe. Je réserverais '| =' pour les cas où vous avez besoin de la valeur actuelle pour déterminer la nouvelle valeur. –