yq/pkg/yqlib/doc/operators/add.md
2023-05-02 14:07:59 +10:00

3.9 KiB

Add

Add behaves differently according to the type of the LHS:

  • arrays: concatenate
  • number scalars: arithmetic addition
  • string scalars: concatenate
  • maps: shallow merge (use the multiply operator (*) to deeply merge)

Use += as a relative append assign for things like increment. Note that .a += .x is equivalent to running .a = .a + .x.

Append to existing array

Note that the styling is copied from existing array elements

Given a sample.yml file of:

a: ['dog']

then

yq '.a += "cat"' sample.yml

will output

a: ['dog', 'cat']

Prepend to existing array

Given a sample.yml file of:

a:
  - dog

then

yq '.a = ["cat"] + .a' sample.yml

will output

a:
  - cat
  - dog

Add new object to array

Given a sample.yml file of:

a:
  - dog: woof

then

yq '.a + {"cat": "meow"}' sample.yml

will output

- dog: woof
- cat: meow

Relative append

Given a sample.yml file of:

a:
  a1:
    b:
      - cat
  a2:
    b:
      - dog
  a3: {}

then

yq '.a[].b += ["mouse"]' sample.yml

will output

a:
  a1:
    b:
      - cat
      - mouse
  a2:
    b:
      - dog
      - mouse
  a3:
    b:
      - mouse

String concatenation

Given a sample.yml file of:

{a: cat, b: meow}

then

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

will output

{a: catmeow, b: meow}

Number addition - float

If the lhs or rhs are floats then the expression will be calculated with floats.

Given a sample.yml file of:

{a: 3, b: 4.9}

then

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

will output

{a: 7.9, b: 4.9}

Number addition - int

If both the lhs and rhs are ints then the expression will be calculated with ints.

Given a sample.yml file of:

{a: 3, b: 4}

then

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

will output

{a: 7, b: 4}

Increment numbers

Given a sample.yml file of:

{a: 3, b: 5}

then

yq '.[] += 1' sample.yml

will output

{a: 4, b: 6}

Date addition

You can add durations to dates. Assumes RFC3339 date time format, see date-time operators for more information.

Given a sample.yml file of:

a: 2021-01-01T00:00:00Z

then

yq '.a += "3h10m"' sample.yml

will output

a: 2021-01-01T03:10:00Z

Date addition - custom format

You can add durations to dates. See date-time operators for more information.

Given a sample.yml file of:

a: Saturday, 15-Dec-01 at 2:59AM GMT

then

yq 'with_dtf("Monday, 02-Jan-06 at 3:04PM MST", .a += "3h1m")' sample.yml

will output

a: Saturday, 15-Dec-01 at 6:00AM GMT

Add to null

Adding to null simply returns the rhs

Running

yq --null-input 'null + "cat"'

will output

cat

Add maps to shallow merge

Adding objects together shallow merges them. Use * to deeply merge.

Given a sample.yml file of:

a:
  thing:
    name: Astuff
    value: x
  a1: cool
b:
  thing:
    name: Bstuff
    legs: 3
  b1: neat

then

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

will output

a:
  thing:
    name: Bstuff
    legs: 3
  a1: cool
  b1: neat
b:
  thing:
    name: Bstuff
    legs: 3
  b1: neat

Custom types: that are really strings

When custom tags are encountered, yq will try to decode the underlying type.

Given a sample.yml file of:

a: !horse cat
b: !goat _meow

then

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

will output

a: !horse cat_meow
b: !goat _meow

Custom types: that are really numbers

When custom tags are encountered, yq will try to decode the underlying type.

Given a sample.yml file of:

a: !horse 1.2
b: !goat 2.3

then

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

will output

a: !horse 3.5
b: !goat 2.3