mirror of
https://github.com/mikefarah/yq.git
synced 2026-06-27 15:37:47 +00:00
* 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>
184 lines
2.6 KiB
Markdown
184 lines
2.6 KiB
Markdown
# 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:
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- frog
|
|
- cow
|
|
```
|
|
then
|
|
```bash
|
|
yq '.[1:3]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
- dog
|
|
- frog
|
|
```
|
|
|
|
## Slicing arrays - without the first number
|
|
Starts from the start of the array
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- frog
|
|
- cow
|
|
```
|
|
then
|
|
```bash
|
|
yq '.[:2]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
```
|
|
|
|
## Slicing arrays - without the second number
|
|
Finishes at the end of the array
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- frog
|
|
- cow
|
|
```
|
|
then
|
|
```bash
|
|
yq '.[2:]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
- frog
|
|
- cow
|
|
```
|
|
|
|
## Slicing arrays - use negative numbers to count backwards from the end
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- frog
|
|
- cow
|
|
```
|
|
then
|
|
```bash
|
|
yq '.[1:-1]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
- dog
|
|
- frog
|
|
```
|
|
|
|
## Inserting into the middle of an array
|
|
using an expression to find the index
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- frog
|
|
- cow
|
|
```
|
|
then
|
|
```bash
|
|
yq '(.[] | select(. == "dog") | key + 1) as $pos | .[0:($pos)] + ["rabbit"] + .[$pos:]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
- cat
|
|
- dog
|
|
- rabbit
|
|
- frog
|
|
- cow
|
|
```
|
|
|
|
## Slicing strings
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
country: Australia
|
|
```
|
|
then
|
|
```bash
|
|
yq '.country[0:5]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
Austr
|
|
```
|
|
|
|
## Slicing strings - without the second number
|
|
Finishes at the end of the string
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
country: Australia
|
|
```
|
|
then
|
|
```bash
|
|
yq '.country[5:]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
alia
|
|
```
|
|
|
|
## Slicing strings - without the first number
|
|
Starts from the start of the string
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
country: Australia
|
|
```
|
|
then
|
|
```bash
|
|
yq '.country[:5]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
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:
|
|
```yaml
|
|
country: Australia
|
|
```
|
|
then
|
|
```bash
|
|
yq '.country[-5:]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
ralia
|
|
```
|
|
|
|
## Slicing strings - Unicode
|
|
Indices are rune-based, so multi-byte characters are handled correctly
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
greeting: héllo
|
|
```
|
|
then
|
|
```bash
|
|
yq '.greeting[1:3]' sample.yml
|
|
```
|
|
will output
|
|
```yaml
|
|
él
|
|
```
|
|
|