dasel
Dasel v3
Dasel (Data-Select) is a CLI tool for querying, modifying, and converting structured data files using a consistent query syntax across formats.
Docs are bundled in
references/. Read them when you need deeper detail on a topic.
CLI basics
# Read from stdin, specify input format
echo '{"name":"Tom"}' | dasel -i json 'name'
# => "Tom"
# Read from a file via stdin redirection
dasel -i yaml 'database.host' < config.yaml
# Convert formats: read JSON, output YAML
cat data.json | dasel -i json -o yaml
# Output the whole document (needed when modifying)
echo '{"a":1}' | dasel -i json --root 'a = 2'
# => {"a": 2}
Key flags:
| Flag | Short | Purpose |
|---|---|---|
--in FORMAT |
-i |
Input format (json, yaml, toml, xml, csv, hcl, ini) |
--out FORMAT |
-o |
Output format |
--root |
Output the full document, not just the selected value | |
--var name=fmt:file:path |
Pass a file as a named variable | |
--read-flag key=val |
Parser-specific read options | |
--write-flag key=val |
Parser-specific write options | |
--config PATH |
-c |
Path to dasel config file (default: ~/dasel.yaml) |
--unstable |
Enable unstable/experimental features |
Query syntax
Queries are dot-chained accessors and function calls, terminated with ; when using multiple statements.
# Access nested fields
user.address.city
# Array index (zero-based)
users[0].name
# Range slice
users[0:4]
# Assign (modifies the value in the document)
user.name = "Alice"
# Variables - $root is stdin, $this is current element
$root.users.filter(active == true).map(name)
Multi-statement queries (use ; to separate, last statement is the output):
$active = $root.users.filter(active == true);
$active.map(name)
Environment variables
GREETING=hello NAME=tom dasel '$GREETING + " " + $NAME'
# => "hello tom"
Common patterns
Read a value
echo '{"foo":{"bar":"baz"}}' | dasel -i json 'foo.bar'
# => "baz"
Modify a value (output full document)
echo '{"foo":"old"}' | dasel -i json --root 'foo = "new"'
# => {"foo": "new"}
Edit a file in place
dasel -i yaml --root 'server.port = 9090' < config.yaml > config.yaml.tmp \
&& mv config.yaml.tmp config.yaml
Note: there is no
-fflag for data files in v3. Always use stdin (< fileorcat file |). Note: always go via a temp file — bash truncates the target before dasel reads it.
Filter an array
echo '{"users":[{"name":"Alice","active":true},{"name":"Bob","active":false}]}' \
| dasel -i json 'users.filter(active == true).map(name)'
# => ["Alice"]
Map / transform
echo '[1,2,3]' | dasel -i json 'map($this * 2)'
# => [2, 4, 6]
Modify elements in place with each
echo '[1,2,3]' | dasel -i json 'each($this = $this + 1)'
# => [2, 3, 4]
Default / coalesce
# Fall back to a default if path missing
dasel -f config.yaml 'server.timeout ?? 30'
Conditional
dasel -f data.json 'if(count > 5) { "many" } else { "few" }'
Recursive descent — find all values by key
# All values with key "name" at any depth
dasel -f data.json '..name'
# All values at any depth
dasel -f data.json '..*'
Predicate-based deep search
dasel -f data.json 'search(has("id") && has("name"))'
Format conversion
cat file.json | dasel -i json -o yaml
cat file.yaml | dasel -i yaml -o toml
Build a new object
echo '{"first":"Tom","last":"Wright"}' \
| dasel -i json '{"fullName": first + " " + last}'
Spread operator
# Merge objects
echo '{"a":1}' | dasel -i json '{$this..., "b": 2}'
# => {"a":1,"b":2}
# Append to array
echo '[1,2,3]' | dasel -i json '[$this..., 4, 5]'
# => [1,2,3,4,5]
Supported formats
| Format | Read | Write | Notes |
|---|---|---|---|
| json | ✓ | ✓ | |
| yaml | ✓ | ✓ | |
| xml | ✓ | ✓ | See --read-flag xml-mode=structured |
| csv | ✓ | ✓ | All values as strings; --read-flag csv-delimiter=; |
| hcl | ✓ | ✓ | --read-flag hcl-block-format=array |
| toml | ✓ | ✓ | Generally working; unsorted maps |
| ini | ✓ | ✓ | Basic sections + key values only |
Key functions
| Function | Description | Example |
|---|---|---|
filter(pred) |
Filter array by predicate | arr.filter($this > 1) |
map(expr) |
Transform each element | arr.map($this * 2) |
each(expr) |
Iterate and modify in place | arr.each($this = $this+1) |
search(pred) |
Recursive predicate search | search(has("key")) |
has(key) |
Check key/index exists | has("name") |
len(x) |
Length of array/string | len($root.items) |
keys(obj) |
Keys of a map | keys($root.config) |
add(a,b) |
Add / concatenate | add(1, 2) |
join(arr, sep) |
Join array to string | join(tags, ",") |
replace(str,old,new) |
String replace | replace(name,"_"," ") |
sortBy(key) |
Sort array of objects | users.sortBy(name) |
reverse(arr) |
Reverse array | reverse(items) |
min(arr) / max(arr) |
Min/max of numbers | min(scores) |
sum(arr) |
Sum numbers | sum(prices) |
toString(x) |
Convert to string | toString(id) |
toInt(x) |
Convert to int | toInt(count) |
typeOf(x) |
Type name | typeOf(value) |
parse(fmt, str) |
Parse a string as a format | parse("json", raw) |
readFile(path) |
Read a file | readFile("x.json") |
base64e(str) |
Base64 encode | base64e(token) |
base64d(str) |
Base64 decode | base64d(encoded) |
For full function signatures and examples, see
references/functions.md.
Reference files
| File | When to read |
|---|---|
references/syntax.md |
Deep dive: types, arrays, objects, conditionals, spread, coalesce, branches, regex, recursive descent |
references/functions.md |
All function signatures with examples |
references/input-output.md |
Stdin/stdout, file editing, variables, format flags |
Tips
- Always use
--rootwhen modifying data and wanting the full document back. - Use
;to write multi-statement queries for clarity. $rootis the stdin document;$thisis the current element inside functions.- For in-place file edits, always redirect to a
.tmpfile first, thenmv. - The ternary operator (
? :) is not yet implemented — useif/elseform instead. branchis unstable — requires--unstableflag.
More from aaronflorey/agent-skills
amber-lang
Write, debug, and explain Amber code, the `amber` language that compiles `.ab` files to Bash. Use this skill when the user asks to write an Amber script, convert Bash to Amber, compile Amber to Bash, debug Amber syntax or type errors, or asks about Amber 0.5.1-alpha syntax, functions, types, error handling, the standard library, or the `amber` CLI.
26go-cobra
Write, scaffold, and debug Go CLI applications with `github.com/spf13/cobra`. Use this skill whenever the user mentions Cobra, `cobra.Command`, a Go command-line app, subcommands, persistent or local flags, required flags, argument validation, shell completions, generated docs, or wants to build or refactor a cobra-based CLI.
24laravel-actions
Write, scaffold, explain, and refactor code using the `lorisleiva/laravel-actions` package. Use this skill whenever the user mentions Laravel Actions, `AsAction`, `php artisan make:action`, action classes, converting a controller, job, listener, or command into an action, dispatching an action as a job, using an action as a controller or listener, or adding validation, authorization, testing, or mocking around an action.
24num30-config
Write, debug, and explain Go configuration code using `github.com/num30/config`. Use this skill when the user mentions `num30/config`, wants config structs, file plus env plus CLI flag loading, validation, config watching, precedence rules, or asks how to integrate the num30/config package into a Go application.
22pelican-panel-plugins
Write, scaffold, explain, and debug plugins for the Pelican gaming panel. Use this skill whenever the user mentions Pelican plugins, extending Pelican, FilamentPHP resources or pages for Pelican, plugin service providers, custom permissions, plugin settings, routes, models, widgets, or asks how to add new functionality to the Pelican panel.
21go-viper
Write, debug, and explain Go configuration code with `github.com/spf13/viper`. Use this skill whenever the user mentions Viper, `viper`, config structs, reading config from files plus env vars plus flags, Cobra or `pflag` integration, unmarshaling into structs, env key replacers, config precedence, config watching, or a clean Viper bootstrap.
20