Search code examples
yamlyq

yq: Add new value to list in alphabetical order


I have a simple yaml file called foo.yaml

foo:
 - a
 - c
bar:
 - foo: bar
   foo2: bar2

I'm trying to add a new value (b) to foo, in alphabetical order. I can add the value with +=, but it doesn't get alphabatized

$ yq '.foo += "b"' foo.yaml

foo:
  - a
  - c
  - b
bar:
  - foo: bar
    foo2: bar2

If I use + I can use sort, but I only get the raw values. e.g.:

$ yq '.foo + "b" | sort()' foo.yaml

- a
- b
- c

I tried to set this into a bash variable and then use it with =, but it appears as a multi-line text

$ variable=$(yq '.foo + "b" | sort()' foo.yaml)

$ yq ".foo = \"$variable\"" foo.yaml

foo: |-
  - a
  - b
  - c
bar:
  - foo: bar
    foo2: bar2

Is there an easier way to insert a new value into foo alphabetically, while keeping the rest of the yaml in tact?


Solution

  • The reason you are getting the raw values is that you've told yq to traverse into 'foo'. Instead try:

    yq '.foo = (.foo + "b" | sort)' file.yaml 
    

    yields:

    foo:
      - a
      - b
      - c
    bar:
      - foo: bar
        foo2: bar2
    
    

    Explanation:

    • you need to update the entry in 'foo'
    • then, in brackets, set the new value. Normally you can use +=, but because you want to sort I've used '='

    Disclaimer: I wrote yq