Modify a key-value in a json using jq in-place
Use a temporary file; it's what any program that claims to do in-place editing is doing.
tmp=$(mktemp)jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json
If the address isn't hard-coded, pass the correct address via a jq
argument:
address=abcdejq --arg a "$address" '.address = $a' test.json > "$tmp" && mv "$tmp" test.json
AFAIK jq
does not support in-place editing, so you must redirect to a temporary file first and then replace your original file with it, or use sponge
utility from the moreutils package, like that:
jq '.address = "abcde"' test.json|sponge test.json
There are other techniques to "redirect to the same file", like saving your output in a variable e.t.c. "Unix & Linux StackExchange" is a good place to start, if you want to learn more about this.
Temp files add more complexity when not needed (unless you are truly dealing with JSON files so large you cannot fit them in memory (GB to 100's of GB or TB, depending on how much RAM/parallelism you have)
The Pure bash way.
contents="$(jq '.address = "abcde"' test.json)" && \echo "${contents}" > test.json
Pros
- No temp file to juggle
- Pure bash
- Don't need an admin to install
sponge
, which is not installed by default - Simpler
Note: this can not be combined as "one command", since redirection starts before the left hand side (LHS) of an expression is run, and starting redirection before running jq
erroneously empties the file, hence two separate commands.