yq/operators/select.md
Chris Hamant 3c0fd6a3e9
docs: add hints for common syntax edge cases
Add informational hints to operator documentation covering behaviors
  that may differ from user expectations, particularly for those
  familiar with jq:

  - slice-array: clarify that slicing only works on arrays, not strings
  - select: document behavior when piping select to a literal value
  - equals: note bash history expansion with != operator
  - create-collect-into-object: mention that shorthand {key} syntax
    is not supported
  - collect-into-array: explain difference between [.x | .[]] and [.x[]]
2026-01-28 02:51:22 -05:00

2.9 KiB

Select

Select is used to filter arrays and maps by a boolean expression.

  • equals / not equals (==, !=) operators here
  • comparison (>=, < etc) operators here
  • boolean operators (and, or, any etc) here

Select elements from array using wildcard prefix

Given a sample.yml file of:

- cat
- goat
- dog

then

yq '.[] | select(. == "*at")' sample.yml

will output

cat
goat

Select elements from array using wildcard suffix

Given a sample.yml file of:

- go-kart
- goat
- dog

then

yq '.[] | select(. == "go*")' sample.yml

will output

go-kart
goat

Select elements from array using wildcard prefix and suffix

Given a sample.yml file of:

- ago
- go
- meow
- going

then

yq '.[] | select(. == "*go*")' sample.yml

will output

ago
go
going

Select elements from array with regular expression

See more regular expression examples under the string operator docs.

Given a sample.yml file of:

- this_0
- not_this
- nor_0_this
- thisTo_4

then

yq '.[] | select(test("[a-zA-Z]+_[0-9]$"))' sample.yml

will output

this_0
thisTo_4

Select items from a map

Given a sample.yml file of:

things: cat
bob: goat
horse: dog

then

yq '.[] | select(. == "cat" or test("og$"))' sample.yml

will output

cat
dog

Use select and with_entries to filter map keys

Given a sample.yml file of:

name: bob
legs: 2
game: poker

then

yq 'with_entries(select(.key | test("ame$")))' sample.yml

will output

name: bob
game: poker

Select multiple items in a map and update

Note the brackets around the entire LHS.

Given a sample.yml file of:

a:
  things: cat
  bob: goat
  horse: dog

then

yq '(.a.[] | select(. == "cat" or . == "goat")) |= "rabbit"' sample.yml

will output

a:
  things: rabbit
  bob: rabbit
  horse: dog

Piping select to a literal

{% hint style="warning" %}

Note that piping select() to a literal value produces that literal for each match. When there are no matches, the literal is still produced once:

Given a sample.yml file of:

a: 1

then

yq '(.a | select(. == 999) | "matched") // "default"' sample.yml

will output

matched

Since .a is 1, not 999, you might expect "default" here.

The select does filter correctly when not followed by a literal:

yq '.a | select(. == 999)' sample.yml

will output nothing (empty).

Workaround: Return the matched value itself, or use with():

yq '(.a | select(. == 1)) // "default"' sample.yml

{% endhint %}