yqといえはyamlファイルをパースして整形するイメージが強いですが、要素の追加・削除・更新もできることを知ったのでまとめます!
要素の追加
.path.key = "value"
の形式で追加したい内容を指定すればOK
$ cat << EOF | yq '.path1.key2 = "value2"'
path1:
key1: value1
EOF
path1:
key1: value1
key2: value2
コメントの追加
特定の行にコメントを追加することもできます!
(スクリプトで要素を追加したはいいけど、人目で確認もして欲しいような時にTODOコメントつけるとか)
$ cat << EOF | yq '(.path1.key2 | key) head_comment="TODO Please check this."'
path1:
key1: value1
key2: ...
EOF
path1:
key1: value1
# TODO Please check this.
key2: '...'
もしくは
$ cat << EOF | yq '.path1.key2 line_comment="TODO Please check this."'
path1:
key1: value1
key2: ...
EOF
path1:
key1: value1
key2: '...' # TODO Please check this.
要素の削除
del(削除したいパス)
という形式で実行します。
$ cat << EOF | yq 'del(.path1.key2)'
path1:
key1: value1
key2: value2
EOF
path1:
key1: value1
条件に合う親要素を削除する
selectと組み合わせます。以下はvalueにdummy
が設定されている配列要素を削除する例です。
$ cat << EOF | yq 'del(.path1[] | select(.[].value == "dummy"))'
path1:
- key1:
value: value1
- key2:
value: dummy
EOF
path1:
- key1:
value: value1
要素の更新
更新したい要素 = "更新後の値"
で指定すればOK
$ cat << EOF | yq '.path1.key2 = "updated2"'
path1:
key1: value1
key2: value2
EOF
path1:
key1: value1
key2: updated2