mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
334 lines
4.2 KiB
Markdown
334 lines
4.2 KiB
Markdown
|
# Anchor and Alias Operators
|
||
|
|
||
|
Use the `alias` and `anchor` operators to read and write yaml aliases and anchors. The `explode` operator normalises a yaml file (dereference (or expands) aliases and remove anchor names).
|
||
|
|
||
|
`yq` supports merge aliases (like `<<: *blah`) however this is no longer in the standard yaml spec (1.2) and so `yq` will automatically add the `!!merge` tag to these nodes as it is effectively a custom tag.
|
||
|
|
||
|
|
||
|
## Merge one map
|
||
|
see https://yaml.org/type/merge.html
|
||
|
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
- &CENTER
|
||
|
x: 1
|
||
|
y: 2
|
||
|
- &LEFT
|
||
|
x: 0
|
||
|
y: 2
|
||
|
- &BIG
|
||
|
r: 10
|
||
|
- &SMALL
|
||
|
r: 1
|
||
|
- !!merge <<: *CENTER
|
||
|
r: 10
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.[4] | explode(.)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
x: 1
|
||
|
y: 2
|
||
|
r: 10
|
||
|
```
|
||
|
|
||
|
## Merge multiple maps
|
||
|
see https://yaml.org/type/merge.html
|
||
|
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
- &CENTER
|
||
|
x: 1
|
||
|
y: 2
|
||
|
- &LEFT
|
||
|
x: 0
|
||
|
y: 2
|
||
|
- &BIG
|
||
|
r: 10
|
||
|
- &SMALL
|
||
|
r: 1
|
||
|
- !!merge <<:
|
||
|
- *CENTER
|
||
|
- *BIG
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.[4] | explode(.)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
r: 10
|
||
|
x: 1
|
||
|
y: 2
|
||
|
```
|
||
|
|
||
|
## Override
|
||
|
see https://yaml.org/type/merge.html
|
||
|
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
- &CENTER
|
||
|
x: 1
|
||
|
y: 2
|
||
|
- &LEFT
|
||
|
x: 0
|
||
|
y: 2
|
||
|
- &BIG
|
||
|
r: 10
|
||
|
- &SMALL
|
||
|
r: 1
|
||
|
- !!merge <<:
|
||
|
- *BIG
|
||
|
- *LEFT
|
||
|
- *SMALL
|
||
|
x: 1
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.[4] | explode(.)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
r: 10
|
||
|
x: 1
|
||
|
y: 2
|
||
|
```
|
||
|
|
||
|
## Get anchor
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
a: &billyBob cat
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a | anchor' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
billyBob
|
||
|
```
|
||
|
|
||
|
## Set anchor
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
a: cat
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a anchor = "foobar"' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
a: &foobar cat
|
||
|
```
|
||
|
|
||
|
## Set anchor relatively using assign-update
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
a:
|
||
|
b: cat
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a anchor |= .b' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
a: &cat
|
||
|
b: cat
|
||
|
```
|
||
|
|
||
|
## Get alias
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
b: &billyBob meow
|
||
|
a: *billyBob
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a | alias' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
billyBob
|
||
|
```
|
||
|
|
||
|
## Set alias
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a: cat
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a alias = "meow"' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a: *meow
|
||
|
```
|
||
|
|
||
|
## Set alias to blank does nothing
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a: cat
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a alias = ""' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a: cat
|
||
|
```
|
||
|
|
||
|
## Set alias relatively using assign-update
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a:
|
||
|
f: meow
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.a alias |= .f' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
b: &meow purr
|
||
|
a: *meow
|
||
|
```
|
||
|
|
||
|
## Explode alias and anchor
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
f:
|
||
|
a: &a cat
|
||
|
b: *a
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval 'explode(.f)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
f:
|
||
|
a: cat
|
||
|
b: cat
|
||
|
```
|
||
|
|
||
|
## Explode with no aliases or anchors
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
a: mike
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval 'explode(.a)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
a: mike
|
||
|
```
|
||
|
|
||
|
## Explode with alias keys
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
f:
|
||
|
a: &a cat
|
||
|
*a: b
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval 'explode(.f)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
f:
|
||
|
a: cat
|
||
|
cat: b
|
||
|
```
|
||
|
|
||
|
## Explode with merge anchors
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
foo: &foo
|
||
|
a: foo_a
|
||
|
thing: foo_thing
|
||
|
c: foo_c
|
||
|
bar: &bar
|
||
|
b: bar_b
|
||
|
thing: bar_thing
|
||
|
c: bar_c
|
||
|
foobarList:
|
||
|
b: foobarList_b
|
||
|
!!merge <<:
|
||
|
- *foo
|
||
|
- *bar
|
||
|
c: foobarList_c
|
||
|
foobar:
|
||
|
c: foobar_c
|
||
|
!!merge <<: *foo
|
||
|
thing: foobar_thing
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval 'explode(.)' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
foo:
|
||
|
a: foo_a
|
||
|
thing: foo_thing
|
||
|
c: foo_c
|
||
|
bar:
|
||
|
b: bar_b
|
||
|
thing: bar_thing
|
||
|
c: bar_c
|
||
|
foobarList:
|
||
|
b: bar_b
|
||
|
thing: foo_thing
|
||
|
c: foobarList_c
|
||
|
a: foo_a
|
||
|
foobar:
|
||
|
c: foo_c
|
||
|
a: foo_a
|
||
|
thing: foobar_thing
|
||
|
```
|
||
|
|
||
|
## Dereference and update a field
|
||
|
`Use explode with multiply to dereference an object
|
||
|
|
||
|
Given a sample.yml file of:
|
||
|
```yaml
|
||
|
item_value: &item_value
|
||
|
value: true
|
||
|
thingOne:
|
||
|
name: item_1
|
||
|
!!merge <<: *item_value
|
||
|
thingTwo:
|
||
|
name: item_2
|
||
|
!!merge <<: *item_value
|
||
|
```
|
||
|
then
|
||
|
```bash
|
||
|
yq eval '.thingOne |= explode(.) * {"value": false}' sample.yml
|
||
|
```
|
||
|
will output
|
||
|
```yaml
|
||
|
item_value: &item_value
|
||
|
value: true
|
||
|
thingOne:
|
||
|
name: item_1
|
||
|
value: false
|
||
|
thingTwo:
|
||
|
name: item_2
|
||
|
!!merge <<: *item_value
|
||
|
```
|
||
|
|