Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

change json file by bash script

Tags:

json

bash

I need your help to solve the following problem: I have a JSON file that looks like this:

{   "key1": "value1",   "key2": "value2",   "key3": "value3" } 

how can I add and remove a new key (i.e "key4": "value4") by bash script? I see also the issue to add or remove a comma at the end of last key in the file before adding or removing the new one.

Thank you

like image 686
user3155074 Avatar asked Jul 24 '14 19:07

user3155074


People also ask

How do I edit an existing JSON file?

In the Enterprise Explorer view, right-click your . json file or other file type that contains JSON code and select Open With > JSON Editor. You can compress JSON strings so that the strings display on one line with white space removed between JSON elements.

Can you parse JSON in bash?

Use grep to Parse JSON in Bash grep command can also be used for parsing JSON data. We use the -o option to select only lines that match the given pattern. Then, we specify the pattern '"email": "[^"]*' , which means we want all of the values of the key email .

How do I open a JSON file in Linux terminal?

Vim is a file opener software that can be used to open the JSON file on Linux platform. GitHub Atom is a cross-platform tool to open JSON files. Other than these tools, you can use web browsers like Google Chrome and Mozilla Firefox to open JSON files, which we discuss in detail later.


2 Answers

Your best bet is to use a JSON CLI such as jq:

  • On Debian-based systems such as Ubuntu, you can install it via sudo apt-get install jq
  • On macOS, with Homebrew (http://brew.sh/) installed, use brew install jq

Examples, based on the following input string - output is to stdout:

jsonStr='{ "key1": "value1", "key2": "value2", "key3": "value3" }' 

Remove "key3":

jq 'del(.key3)' <<<"$jsonStr" 

Add property "key4" with value "value4":

jq '. + { "key4": "value4" }' <<<"$jsonStr" 

Change the value of existing property "key1" to "new-value1":

jq '.key1 = "new-value1"' <<<"$jsonStr" 

A more robust alternative thanks, Lars Kiesow :
If you pass the new value with --arg, jq takes care of properly escaping the value:

jq '.key1 = $newVal' --arg newVal '3 " of rain' <<<"$jsonStr" 

If you want to update a JSON file in place (conceptually speaking), using the example of deleting "key3":

# Create test file. echo '{ "key1": "value1", "key2": "value2", "key3": "value3" }' > test.json  # Remove "key3" and write results back to test.json (recreate it with result). jq -c 'del(.key3)' test.json > tmp.$$.json && mv tmp.$$.json test.json 

You cannot replace the input file directly, so the result is written to a temporary file that replaces the input file on success.

Note the -c option, which produces compact rather than pretty-printed JSON.

For all options and commands, see the manual at http://stedolan.github.io/jq/manual/.

like image 88
mklement0 Avatar answered Oct 07 '22 11:10

mklement0


Not the answer for everyone, but if you already happen to have NodeJs installed in your system, you can use it to easily manipulate JSON.

eg:

#!/usr/bin/env bash jsonFile=$1;  node > out_${jsonFile} <<EOF //Read data var data = require('./${jsonFile}');  //Manipulate data delete data.key3 data.key4 = 'new value!';  //Output data console.log(JSON.stringify(data));  EOF 

Heck, if you only need to do JSON manipulation and you have node (ie: You don't really need any other bash functionality) you could directly write a script using node as the interpreter:

#! /usr/bin/env node var data = require('./'+ process.argv[2]); /*manipulate*/ console.log(JSON.stringify(data)); 
like image 27
Lenny Markus Avatar answered Oct 07 '22 11:10

Lenny Markus