简体   繁体   中英

Conditionally add properties to elements of array with yq (version 4)

I have a YAML document that contains an array. I would like to conditionally add properties to the elements of that array using yq version 4 from mikefarah.

Here is a sample YAML document.

name: "My Pets"
pets:
- name: "cat"
  age: 8
- name: "dog"
  age: 3
- name: "mouse"
  age: 1

I would like to transform this into,

name: "My Pets"
pets:
- name: "cat"
  age: 8
  shots: cat.upToDate
- name: "dog"
  age: 3
  shots: dog.upToDate
- name: "mouse"
  age: 1
  shots: mouse.upToDate

where we add a shots property to each element of pets . The value of shots should be whatever the name value is, dot, upToDate .

I'm trying something like this,

yq eval '.pets[] | select(.name == "cat").shots = "cat.upToDate"' test.yaml

but that produces,

name: "cat"
age: 8
shots: cat.upToDate
name: "dog"
age: 3
name: "mouse"
age: 1

I need to preserve the entire original YAML document and just insert the shots property.

This is close but missing all of the other pets.

yq eval '.pets = (.pets[] | select(.name == "cat").shots = "cats.upToDate")' test.yaml

It produces,

name: "My Pets"
pets:
  name: "cat"
  age: 8
  shots: cats.upToDate

I'm thinking maybe we could store the name of the pet in a variable and reference that later, but v4 is brand new to me today.

I would prefer to have a one-liner so that I don't have to filter on .name . This array has less than 10 elements so I could easily hard-code the name and call yq 10 times.

Any thoughts or suggestions? Many thanks, Weldon

Use |= , eg like so:

yq eval '.pets[] |= (.shots = (.name + ".upToDate"))' pets.yaml

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM