user19742249
user19742249

Reputation: 1

Replace value in json files with variable values in shell script

I am creating multiple files from a json template file and I need to replace two values in json file by different values which I am storing in variable. Below is how source json look like

Source :

{"parameters": [
            {
                "name": "dir_parm",
                "value": "changethis"
            }
        ],
        "targets": [
            {
                "identifier": "hsotchangethis"
            }
        ]

}

Output what I require:

"parameters": [
            {
                "name": "dir_parm",
                "value": "/apps"
            }
        ],
        "targets": [
            {
                "identifier": "iass02"
            }
      ]
   }

In this way json file has to be updated for directory and host name around 40-50 times.

Below is the sed command I tried but it is getting replaced. File name, hostname , directory all are variables\dynamic.

sed -i '/identifier/c\ \"identifier\" : '${bdhostnm}'/g' $fname

Note- I read we can use jq but in the organization it is not allowed. Any suggestion would be helpful

Upvotes: 0

Views: 1273

Answers (2)

Haru Suzuki
Haru Suzuki

Reputation: 142

As asked by user a sed solution:
Input

{"parameters": [
            {
                "name": "dir_parm",
                "value": "changethis"
            }
        ],
        "targets": [
            {
                "identifier": "hsotchangethis"
            }
        ]

}
value='/apps'  
bdhostnm='iass02'  
fname=file  
sed '/[ ]*"identifier":/{s/\("identifier": \)\(.*\)/\1'$bdhostnm'/g};/^[ ]*"value": /{s/\("value": \)\(.*\)/\1'${value/\//\\\/}'/g}' $fname
{"parameters": [
            {
                "name": "dir_parm",
                "value": /apps
            }
        ],
        "targets": [
            {
                "identifier": iass02
            }
        ]

}

Upvotes: 3

RavinderSingh13
RavinderSingh13

Reputation: 133780

Since OP doesn't have jq and can't install jq so coming up with this awk solution. Which is written and tested in GNU awk. Here I have created 2 awk variables named valValue and valIdentifier where NEW values for respective(json) fields should be mentioned in them.

Here is the Online demo for used regex in following awk code.

awk -v valValue="/apps" -v valIdentifier="iass02" -v RS="" '
match($0,/^({"parameters": \[\n[[:space:]]+\
{\n[[:space:]]+"name": "dir_parm",\
\n[[:space:]]+"value": ")\
[^"]*("\n[[:space:]]+}\n\
[[:space:]]+\],\n[[:space:]]+\
"targets": \[\n[[:space:]]+\
{\n[[:space:]]+"identifier": ")\
[^"]*("\n[[:space:]]+}\n[[:space:]]+\
\]\n+[[:space:]]+})/,arr){
     print arr[1] valValue arr[2] valIdentifier arr[3]
}
'  Input_file

NOTE: In case someone wants a jq code for this one(though its clearly not a ask in question here), then try like: jq '.parameters[].value |= "/apps" | .targets[].identifier |= "iass02"' Input_file.

Upvotes: 1

Related Questions