2021-11-03 04:00:58 +00:00
# Anchor and Alias Operators
2022-05-25 01:02:18 +00:00
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).
2021-11-03 04:00:58 +00:00
`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.
2022-02-06 03:39:46 +00:00
{% hint style="warning" %}
Note that versions prior to 4.18 require the 'eval/e' command to be specified. 
`yq e <exp> <file>`
{% endhint %}
2021-11-03 04:00:58 +00:00
## 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
2022-01-27 06:21:10 +00:00
yq '.[4] | explode(.)' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq '.[4] | explode(.)' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq '.[4] | explode(.)' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
r: 10
x: 1
y: 2
```
## Get anchor
Given a sample.yml file of:
```yaml
a: & billyBob cat
```
then
```bash
2022-01-27 06:21:10 +00:00
yq '.a | anchor' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
billyBob
```
## Set anchor
Given a sample.yml file of:
```yaml
a: cat
```
then
```bash
2022-01-27 06:21:10 +00:00
yq '.a anchor = "foobar"' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
a: & foobar cat
```
## Set anchor relatively using assign-update
Given a sample.yml file of:
```yaml
a:
b: cat
```
then
```bash
2022-01-27 06:21:10 +00:00
yq '.a anchor |= .b' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
a: & cat
b: cat
```
## Get alias
Given a sample.yml file of:
```yaml
b: & billyBob meow
a: *billyBob
```
then
```bash
2022-01-27 06:21:10 +00:00
yq '.a | alias' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
billyBob
```
## Set alias
Given a sample.yml file of:
```yaml
b: & meow purr
a: cat
```
then
```bash
2022-01-27 06:21:10 +00:00
yq '.a alias = "meow"' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq '.a alias = ""' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq '.a alias |= .f' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq 'explode(.f)' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq 'explode(.a)' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
a: mike
```
## Explode with alias keys
Given a sample.yml file of:
```yaml
f:
a: & a cat
*a: b
```
then
```bash
2022-01-27 06:21:10 +00:00
yq 'explode(.f)' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq 'explode(.)' sample.yml
2021-11-03 04:00:58 +00:00
```
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
2022-01-27 06:21:10 +00:00
yq '.thingOne |= explode(.) * {"value": false}' sample.yml
2021-11-03 04:00:58 +00:00
```
will output
```yaml
item_value: & item_value
value: true
thingOne:
name: item_1
value: false
thingTwo:
name: item_2
!!merge < < : * item_value
```