* 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>
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