change json file by bash script

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 ( 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

Leave a Comment