echo '{"foo": "bar \" baz"}' | jq -r .foo
By default, jq prints values as valid JSON, which means that string values are enclosed in double-quotes, for example:
$ echo '{"foo": "bar"}' | jq .foo "bar"
When you don't want the enclosing double-quotes, some common but incorrect solutions use awk or tr:
... | jq .foo | awk -F'"' '{print $2}' ... | jq .foo | tr -d '"'
These work reasonably well for simple inputs:
awk approach removes the double-quotes by setting " as the field separator and printing the 2nd field. So in the simple example with "bar", the 2nd field is bar, so it successfully produces the output without the double-quotes.tr solution simply deletes all double-quotes in the input, which works just as well in the simple case.These approaches don't work well when the value contains embedded double-quotes. The correct solution is to use jq's -r or --raw-output flags, which tells jq to print "raw" values (without enclosing double-quotes), rather than as JSON strings.
$ echo '{"foo": "bar \" baz"}' | jq .foo | tr -d '"' bar \ baz $ echo '{"foo": "bar \" baz"}' | jq .foo | awk -F'"' '{print $2}' bar \ $ echo '{"foo": "bar \" baz"}' | jq -r .foo bar " baz