PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Sunday, August 21, 2022

[FIXED] How to replace values in a JSON dictionary with their respective shell variables in jq?

 August 21, 2022     environment-variables, jq, json, shell     No comments   

Issue

I have the following JSON structure:

{
  "host1": "$PROJECT1",
  "host2": "$PROJECT2",
  "host3" : "xyz",
  "host4" : "$PROJECT4"
}

And the following environment variables in the shell:

PROJECT1="randomtext1"
PROJECT2="randomtext2"
PROJECT4="randomtext3"

I want to check the values for each key, if they have a "$" character in them, replace them with their respective environment variable(which is already present in the shell) so that my JSON template is rendered with the correct environment variables.

I can use the --args option of jq but there are quite a lot of variables in my actual JSON template that I want to render.

I have been trying the following:

jq 'with_entries(.values as v | env.$v)

Basically making each value as a variable, then updating its value with the variable from the env object but seems like I am missing out on some understanding. Is there a straightforward way of doing this?

EDIT

Thanks to the answers on this question, I was able to achieve my larger goal for a part of which this question was asked

  • iterating over each value in an object,
  • checking its value,
    • if it's a string and starts with the character "$"
      • use the value to update it with an environment variable of the same name .
    • if it's an array
      • use the value to retrieve an environment variable of the same name
      • split the string with "," as delimiter, which returns an array of strings
      • Update the value with the array of strings
         
jq 'with_entries(.value |= (if (type=="array") then (env[.[0][1:]] | split(",")) elif (type=="string" and startswith("$")) then (env[.[1:]]) else  . end))'

Solution

You need to export the Bash variables to be seen by jq:

export PROJECT1="randomtext1"
export PROJECT2="randomtext2"
export PROJECT4="randomtext3"

Then you can go with:

jq -n 'with_entries((.value | select(startswith("$"))) |= env[.[1:]])'

and get:

{
  "host1": "randomtext1",
  "host2": "randomtext2",
  "host3": "xyz",
  "host4": "randomtext3"
}


Answered By - pmf
Answer Checked By - Katrina (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing