yq/pkg/yqlib/doc/operators/slice-array.md
Copilot 3b2423e871
Add string slicing support (#2639)
* Initial plan

* Add string slicing support to yq

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/a8525fbb-77a7-4bb0-a3a7-b24f99ae8710

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>

* Fix sliceStringNode signature and fix test descriptions/expressions

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/58726b13-68ae-4f93-971f-eb70459edcf4

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>

* Update pkg/yqlib/operator_slice.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix array slice out-of-bounds panic with very negative indices

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/7c146762-d251-45fd-8555-2488f59fc57b

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>

* S2-S4: tighten lexer condition, fix doc header, add Unicode example

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/ec06083e-e20a-45d2-bf7e-4e1fa7be1073

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>

* Fix spelling: multibyte -> multi-byte in Unicode test subdescription

Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/6e7b304b-5b52-4e89-8bad-ba22813305c7

Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com>
Co-authored-by: Mike Farah <mikefarah@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-06 19:29:07 +10:00

2.6 KiB

Slice Array or String

The slice operator works on both arrays and strings. Like the jq equivalent, .[10:15] will return a subarray (or substring) of length 5, starting from index 10 inclusive, up to index 15 exclusive. Negative numbers count backwards from the end of the array or string.

You may leave out the first or second number, which will refer to the start or end of the array or string respectively.

Slicing arrays

Given a sample.yml file of:

- cat
- dog
- frog
- cow

then

yq '.[1:3]' sample.yml

will output

- dog
- frog

Slicing arrays - without the first number

Starts from the start of the array

Given a sample.yml file of:

- cat
- dog
- frog
- cow

then

yq '.[:2]' sample.yml

will output

- cat
- dog

Slicing arrays - without the second number

Finishes at the end of the array

Given a sample.yml file of:

- cat
- dog
- frog
- cow

then

yq '.[2:]' sample.yml

will output

- frog
- cow

Slicing arrays - use negative numbers to count backwards from the end

Given a sample.yml file of:

- cat
- dog
- frog
- cow

then

yq '.[1:-1]' sample.yml

will output

- dog
- frog

Inserting into the middle of an array

using an expression to find the index

Given a sample.yml file of:

- cat
- dog
- frog
- cow

then

yq '(.[] | select(. == "dog") | key + 1) as $pos | .[0:($pos)] + ["rabbit"] + .[$pos:]' sample.yml

will output

- cat
- dog
- rabbit
- frog
- cow

Slicing strings

Given a sample.yml file of:

country: Australia

then

yq '.country[0:5]' sample.yml

will output

Austr

Slicing strings - without the second number

Finishes at the end of the string

Given a sample.yml file of:

country: Australia

then

yq '.country[5:]' sample.yml

will output

alia

Slicing strings - without the first number

Starts from the start of the string

Given a sample.yml file of:

country: Australia

then

yq '.country[:5]' sample.yml

will output

Austr

Slicing strings - use negative numbers to count backwards from the end

Negative indices count from the end of the string

Given a sample.yml file of:

country: Australia

then

yq '.country[-5:]' sample.yml

will output

ralia

Slicing strings - Unicode

Indices are rune-based, so multi-byte characters are handled correctly

Given a sample.yml file of:

greeting: héllo

then

yq '.greeting[1:3]' sample.yml

will output

él