Have a file sample.yaml
---
action: "want-to-update"
foo: |-
{
"a" : "actual A",
"b" : "actual B",
"c" : "actual C"
}
---
action: "dont-want-to-update"
foo: |-
.
.
.
Need to update value in a field from actual a to updated a
Tried to update with yq and jq
yq 'select(.action == "want-to-update").foo' sample.yaml | jq '.a = "updated a" | tostring' | xargs -0 -n1 -I{} yq 'select(.action == "want-to-update").foo = {}' -i sample.yaml
Getting output as below:
---
action: "want-to-update"
foo: |-
{"a":"updated a","b":"actual B","c":"actual C"}
---
.
.
But I want the prettier version of above:
---
action: "want-to-update"
foo: |-
{
"a" : "updated A",
"b" : "actual B",
"c" : "actual C"
}
---
CodePudding user response:
Using fromjson and tojson, you can decode and encode JSON on the fly, so all of this can be done with just one call to yq (no jq and no command substitution needed):
yq -i 'select(.action == "want-to-update").foo |= (
fromjson | .a = "updated a" | tojson
)' sample.yaml
CodePudding user response:
Basically, remove tostring
json=$(
yq 'select(.action == "want-to-update").foo' sample.yaml \
| jq '.a = "updated a"'
)
escaped_quotes=${json//\"/\\\"}
yq 'select(.action == "want-to-update").foo = "'"${escaped_quotes}"'"' sample.yaml
---
action: "want-to-update"
foo: |-
{
"a": "updated a",
"b": "actual B",
"c": "actual C"
}
---
action: "dont-want-to-update"
foo: |-
"ok"
