yq/operators/assign-update.md
2023-03-18 14:54:23 +11:00

3.6 KiB

Assign (Update)

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

plain form: =

Which will set the LHS node values equal 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, but the RHS expression is run with each LHS node as context. This is useful for updating values based on old values, e.g. increment.

Flags

  • c clobber custom tags

Create yaml file

Running

yq --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 '.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 '.[] |= . * 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 '.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 '(.a, .c) = "potato"' sample.yml

will output

a: potato
b: fieldB
c: potato

Update string value

Given a sample.yml file of:

a:
  b: apple

then

yq '.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 '.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 don't first filter out the yaml and then update the snippet.

Given a sample.yml file of:

a:
  b: apple
  c: cactus

then

yq '(.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 '(.[] | select(. == "*andy")) = "bogs"' sample.yml

will output

- bogs
- apple
- bogs

Update empty object

Given a sample.yml file of:

{}

then

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

will output

a:
  b: bogs

Update node value that has an anchor

Anchor will remain

Given a sample.yml file of:

a: &cool cat

then

yq '.a = "dog"' sample.yml

will output

a: &cool dog

Update empty object and array

Given a sample.yml file of:

{}

then

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

will output

a:
  b:
    - bogs

Custom types are maintained by default

Given a sample.yml file of:

a: !cat meow
b: !dog woof

then

yq '.a = .b' sample.yml

will output

a: !cat woof
b: !dog woof

Custom types: clobber

Use the c option to clobber custom tags

Given a sample.yml file of:

a: !cat meow
b: !dog woof

then

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

will output

a: !dog woof
b: !dog woof