Write

yq w <yaml_file> <path> <new value>

To Stdout

Given a sample.yaml file of:

b:
  c: 2

then

yq w sample.yaml b.c cat

will output:

b:
  c: cat

From STDIN

cat sample.yaml | yq w - b.c blah

Adding new fields

Any missing fields in the path will be created on the fly.

Given a sample.yaml file of:

b:
  c: 2

then

yq w sample.yaml b.d[+] "new thing"

will output:

b:
  c: cat
  d:
    - new thing

Splat

Given a sample.yaml file of:

---
bob:
  item1:
    cats: bananas
  item2:
    cats: apples
  thing:
    cats: oranges

then

yq w sample.yaml bob.*.cats meow

will output:

---
bob:
  item1:
    cats: meow
  item2:
    cats: meow
  thing:
    cats: meow

Prefix Splat

Given a sample.yaml file of:

---
bob:
  item1:
    cats: bananas
  item2:
    cats: apples
  thing:
    cats: oranges

then

yq w sample.yaml bob.item*.cats meow

will output:

---
bob:
  item1:
    cats: meow
  item2:
    cats: meow
  thing:
    cats: oranges

Array Splat

Given a sample.yaml file of:

---
bob:
- cats: bananas
- cats: apples
- cats: oranges

then

yq w sample.yaml bob[*].cats meow

will output:

---
bob:
- cats: meow
- cats: meow
- cats: meow

Appending value to an array field

Given a sample.yaml file of:

b:
  c: 2
  d:
    - new thing
    - foo thing

then

yq w sample.yaml "b.d[+]" "bar thing"

will output:

b:
  c: cat
  d:
    - new thing
    - foo thing
    - bar thing

Note that the path is in quotes to avoid the square brackets being interpreted by your shell.

Multiple Documents - update a single document

Given a sample.yaml file of:

something: else
---
b:
  c: 2

then

yq w -d1 sample.yaml b.c 5

will output:

something: else
---
b:
  c: 5

Multiple Documents - update all documents

Given a sample.yaml file of:

something: else
---
b:
  c: 2

then

yq w -d'*' sample.yaml b.c 5

will output:

something: else
b:
  c: 5
---
b:
  c: 5

Note that '*' is in quotes to avoid being interpreted by your shell.

Updating files in-place

Given a sample.yaml file of:

b:
  c: 2

then

yq w -i sample.yaml b.c cat

will update the sample.yaml file so that the value of 'c' is cat.

Updating multiple values with a script

Given a sample.yaml file of:

b:
  c: 2
  e:
    - name: Billy Bob

and a script update_instructions.yaml of:

b.c: 3
b.e[+].name: Howdy Partner

then

yq w -s update_instructions.yaml sample.yaml

will output:

b:
  c: 3
  e:
    - name: Howdy Partner

And, of course, you can pipe the instructions in using '-':

cat update_instructions.yaml | yq w -s - sample.yaml

Values starting with a hyphen (or dash)

The flag terminator needs to be used to stop the app from attempting to parse the subsequent arguments as flags:

yq w -- my.path -3

will output

my:
  path: -3

Keys with dots

When specifying a key that has a dot use key lookup indicator.

b:
  foo.bar: 7
yaml r sample.yaml 'b[foo.bar]'
yaml w sample.yaml 'b[foo.bar]' 9

Any valid yaml key can be specified as part of a key lookup.

Note that the path is in quotes to avoid the square brackets being interpreted by your shell.

Keys (and values) with leading dashes

If a key or value has leading dashes, yq won't know that you are passing a value as opposed to a flag (and you will get a 'bad flag syntax' error).

To fix that, you will need to tell it to stop processing flags by adding '--' after the last flag like so:

yq n -t -- --key --value

Will result in

` --key: --value

Last updated