yq/operators/assign-update.md
2021-11-03 15:00:28 +11:00

3.0 KiB

Assign (Update)

This operator is used to update node values. It can be used in either the:

plain form: =

Which will assign the LHS node values to the RHS node values. The RHS expression is run against the matching nodes in the pipeline.

relative form: |=

This will do a similar thing to the plain form, however, the RHS expression is run against the LHS nodes. This is useful for updating values based on old values, e.g. increment.

Create yaml file

Running

yq eval --null-input '.a.b = "cat" | .x = "frog"'

will output

a:
  b: cat
x: frog

Update node to be the child value

Given a sample.yml file of:

a:
  b:
    g: foof

then

yq eval '.a |= .b' sample.yml

will output

a:
  g: foof

Double elements in an array

Given a sample.yml file of:

- 1
- 2
- 3

then

yq eval '.[] |= . * 2' sample.yml

will output

- 2
- 4
- 6

Update node from another file

Note this will also work when the second file is a scalar (string/number)

Given a sample.yml file of:

a: apples

And another sample another.yml file of:

b: bob

then

yq eval-all 'select(fileIndex==0).a = select(fileIndex==1) | select(fileIndex==0)' sample.yml another.yml

will output

a:
  b: bob

Update node to be the sibling value

Given a sample.yml file of:

a:
  b: child
b: sibling

then

yq eval '.a = .b' sample.yml

will output

a: sibling
b: sibling

Updated multiple paths

Given a sample.yml file of:

a: fieldA
b: fieldB
c: fieldC

then

yq eval '(.a, .c) = "potatoe"' sample.yml

will output

a: potatoe
b: fieldB
c: potatoe

Update string value

Given a sample.yml file of:

a:
  b: apple

then

yq eval '.a.b = "frog"' sample.yml

will output

a:
  b: frog

Update string value via |=

Note there is no difference between = and |= when the RHS is a scalar

Given a sample.yml file of:

a:
  b: apple

then

yq eval '.a.b |= "frog"' sample.yml

will output

a:
  b: frog

Update deeply selected results

Note that the LHS is wrapped in brackets! This is to ensure we dont first filter out the yaml and then update the snippet.

Given a sample.yml file of:

a:
  b: apple
  c: cactus

then

yq eval '(.a[] | select(. == "apple")) = "frog"' sample.yml

will output

a:
  b: frog
  c: cactus

Update array values

Given a sample.yml file of:

- candy
- apple
- sandy

then

yq eval '(.[] | select(. == "*andy")) = "bogs"' sample.yml

will output

- bogs
- apple
- bogs

Update empty object

Given a sample.yml file of:

{}

then

yq eval '.a.b |= "bogs"' sample.yml

will output

{a: {b: bogs}}

Update empty object and array

Given a sample.yml file of:

{}

then

yq eval '.a.b.[0] |= "bogs"' sample.yml

will output

{a: {b: [bogs]}}