Drill 03: Editing

In-place edits, merge, and delete. Where yq becomes a config management tool.

Run This Drill

bash ~/atelier/_bibliotheca/domus-captures/docs/modules/ROOT/examples/yq-drills/03-editing.sh

Drill Script

#!/bin/bash
# YQ DRILL 03: EDITING
# Paste this entire script into your terminal
# Topics: In-place edit, add, delete, merge

cat << 'EOF' > /tmp/yq-edit.yaml
name: domus-test
version: "~"
asciidoc:
  attributes:
    domain: inside.domusdigitalis.dev
    ise-pan-ip: 10.50.1.20
    port-dns: 53
nav:
  - modules/ROOT/nav.adoc
EOF
cp /tmp/yq-edit.yaml /tmp/yq-edit-backup.yaml

echo "=================================================================="
echo "             YQ DRILL 03: EDITING                                 "
echo "=================================================================="
echo ""
echo "Test file: /tmp/yq-edit.yaml (backup: /tmp/yq-edit-backup.yaml)"
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.1: SET A VALUE (preview, no -i)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq '.version = \"1.0\"' /tmp/yq-edit.yaml"
yq '.version = "1.0"' /tmp/yq-edit.yaml
echo ""
echo "(File unchanged — no -i flag)"
echo "Verify: yq '.version' /tmp/yq-edit.yaml"
yq '.version' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.2: SET A VALUE (in-place with -i)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq -i '.version = \"1.0\"' /tmp/yq-edit.yaml"
yq -i '.version = "1.0"' /tmp/yq-edit.yaml
echo "Verify: yq '.version' /tmp/yq-edit.yaml"
yq '.version' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.3: ADD A NEW KEY"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq -i '.asciidoc.attributes.vault-ip = \"10.50.1.60\"' /tmp/yq-edit.yaml"
yq -i '.asciidoc.attributes.vault-ip = "10.50.1.60"' /tmp/yq-edit.yaml
echo "Verify: yq '.asciidoc.attributes' /tmp/yq-edit.yaml"
yq '.asciidoc.attributes' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.4: ADD TO A SEQUENCE"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq -i '.nav += [\"modules/tutorials/nav.adoc\"]' /tmp/yq-edit.yaml"
yq -i '.nav += ["modules/tutorials/nav.adoc"]' /tmp/yq-edit.yaml
echo "Verify: yq '.nav' /tmp/yq-edit.yaml"
yq '.nav' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.5: DELETE A KEY"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq -i 'del(.asciidoc.attributes.port-dns)' /tmp/yq-edit.yaml"
yq -i 'del(.asciidoc.attributes.port-dns)' /tmp/yq-edit.yaml
echo "Verify: yq '.asciidoc.attributes' /tmp/yq-edit.yaml"
yq '.asciidoc.attributes' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.6: DELETE FROM SEQUENCE"
echo "------------------------------------------------------------------"
echo ""
echo "Command: yq -i '.nav -= [\"modules/tutorials/nav.adoc\"]' /tmp/yq-edit.yaml"
yq -i '.nav -= ["modules/tutorials/nav.adoc"]' /tmp/yq-edit.yaml
echo "Verify: yq '.nav' /tmp/yq-edit.yaml"
yq '.nav' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.7: MERGE TWO FILES"
echo "------------------------------------------------------------------"
echo ""
cat << 'EOF' > /tmp/yq-overlay.yaml
asciidoc:
  attributes:
    new-attr: overlay-value
    domain: override.example.com
EOF
echo "Command: yq '. * load(\"/tmp/yq-overlay.yaml\")' /tmp/yq-edit.yaml"
yq '. * load("/tmp/yq-overlay.yaml")' /tmp/yq-edit.yaml
echo ""
echo "(domain overridden, new-attr added, rest preserved)"
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.8: RESTORE FROM BACKUP"
echo "------------------------------------------------------------------"
echo ""
echo "Command: cp /tmp/yq-edit-backup.yaml /tmp/yq-edit.yaml"
cp /tmp/yq-edit-backup.yaml /tmp/yq-edit.yaml
echo "Restored. Verify: yq '.version' /tmp/yq-edit.yaml"
yq '.version' /tmp/yq-edit.yaml
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "YOUR TURN - TRY THESE:"
echo "------------------------------------------------------------------"
echo ""
echo "1. Add 3 attributes, then list them all:"
echo "   yq -i '.asciidoc.attributes.k3s-ip = \"10.50.1.80\"' /tmp/yq-edit.yaml"
echo ""
echo "2. Rename a key (delete old + add new):"
echo "   yq -i '.asciidoc.attributes.ise-01-ip = .asciidoc.attributes.ise-pan-ip | del(.asciidoc.attributes.ise-pan-ip)' /tmp/yq-edit.yaml"
echo ""
echo "3. Add a comment: yq -i '.name line_comment = \"test config\"' /tmp/yq-edit.yaml"
echo ""
echo "------------------------------------------------------------------"
echo "KEY TAKEAWAYS:"
echo "1. Without -i: preview to stdout (safe)"
echo "2. With -i: modifies file in place (back up first!)"
echo "3. .key = val sets, del(.key) removes"
echo "4. += adds to sequence, -= removes from sequence"
echo "5. . * load(\"file\") merges (right side wins)"
echo "------------------------------------------------------------------"