| name | data-transformation |
| description | Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI |
Data Transformation with Dasel v3
<when_to_use>
Activate this skill when:
- Modifying values in config files (YAML, TOML, JSON, XML, HCL, INI)
- Converting between data formats (JSON to YAML, TOML to JSON, etc.)
- Batch-updating array elements (prices, versions, flags)
- Appending, removing, or reshaping data structures
- Merging objects or constructing new structures from existing data
</when_to_use>
Safety Rules
NEVER redirect output to the same input file. This truncates the file before dasel reads it, resulting in data loss:
cat config.yaml | dasel -i yaml --root 'port = 9090' > config.yaml
cat config.yaml | dasel -i yaml --root 'port = 9090' > config_tmp.yaml && mv config_tmp.yaml config.yaml
Always verify before overwriting. Preview the transformation output first, then redirect:
cat config.yaml | dasel -i yaml --root 'server.port = 9090'
cat config.yaml | dasel -i yaml --root 'server.port = 9090' > config_tmp.yaml && mv config_tmp.yaml config.yaml
Core Modification Syntax
In dasel v3, put and delete subcommands do not exist. All modifications use assignment expressions with --root to output the full document.
Set a Value
cat config.yaml | dasel -i yaml --root 'server.port = 9090'
echo '{"count": 1}' | dasel -i json --root 'count = 42'
echo '{"enabled": false}' | dasel -i json --root 'enabled = true'
echo '{"name": "old"}' | dasel -i json --root 'name = "new"'
Set Nested Values
cat config.yaml | dasel -i yaml --root 'database.connection.host = "db.example.com"'
cat config.yaml | dasel -i yaml --root 'database.connection.port = 5432'
In-Place Modification (Safe Pattern)
cat config.yaml | dasel -i yaml --root 'server.port = 9090' > config_tmp.yaml && mv config_tmp.yaml config.yaml
cat config.yaml | dasel -i yaml --root 'server.port = 9090; server.host = "0.0.0.0"' > config_tmp.yaml && mv config_tmp.yaml config.yaml
Format Conversion
Pipe through dasel with different input/output format flags:
cat data.json | dasel -i json -o yaml > data.yaml
cat config.yaml | dasel -i yaml -o toml > config.toml
cat data.json | dasel -i json -o xml > data.xml
cat config.toml | dasel -i toml -o json > config.json
cat data.csv | dasel -i csv -o json > data.json
Array Operations
Append to Array
echo '[1,2,3]' | dasel -i json --root '[$this..., 4]'
cat data.json | dasel -i json --root 'items = [$root.items..., {"name": "new", "value": 42}]'
Batch Update with each
cat data.json | dasel -i json --root 'items.each(price = price * 1.1)'
cat data.json | dasel -i json --root 'users.each(active = true)'
echo '[1,2,3]' | dasel -i json --root 'each($this = $this + 1)'
Filter Then Transform
cat data.json | dasel -i json 'users.filter(active == true).map(name)'
Object Operations
Merge via Spread
cat base.json | dasel -i json --root '{ $root..., "newKey": "value" }'
cat base.json | dasel -i json --root '{ $root..., "extra": true, "version": 2 }'
Field Deletion via Reconstruction
Since v3 has no delete command, remove fields by constructing a new object with only the desired keys:
echo '{"name":"a","email":"b","password":"c"}' | dasel -i json --root '{ name, email }'
Field Rename via Reconstruction
echo '{"old_name": "value"}' | dasel -i json --root '{ "new_name": old_name }'
Multi-Step Transformations
Use variable assignment and semicolons for complex operations:
cat data.json | dasel -i json '$active = users.filter(active == true); $active.map(name)'
cat data.json | dasel -i json '$a = items.filter(price > 100); $b = $a.map(name); $b'
Conditional Transformation
cat data.json | dasel -i json --root 'if(count > 5) { status = "many" } else { status = "few" }'
Transformation Patterns
For detailed per-use-case transformation patterns (config updates, batch processing, format migration, data reshaping, error handling), see Transformation Patterns.
References