dasel v3 Syntax Reference
Single-binary CLI for querying, modifying, and converting structured data. Replaces jq + yq + xmllint with one unified query syntax across all formats.
Stable version at writing (date: 2026-02-23): v3.2.3
Supported Formats
json, yaml, toml, xml, csv, hcl, ini
Basic Usage
# Query from stdin (format required)
echo '{"foo": "bar"}' | dasel -i json 'foo'
# Query from file via stdin
cat config.yaml | dasel -i yaml 'database.host'
# Modify and output full document
echo '{"port": 3000}' | dasel -i json --root 'server.port = 8080'
# Convert formats
cat data.json | dasel -i json -o yaml
Format Handling
dasel v3 does NOT auto-detect format from file extension. There is no -f/--file flag. Input is always read from stdin. Format must be specified explicitly with -i and/or -o. If only one is given, the other defaults to it. If neither is given, both default to json (configurable via ~/dasel.yaml with default_format key).
Source: internal/cli/query.go:10-11, internal/cli/run.go:37-43, internal/cli/config.go:19-21
Key Flags
-i, --in <format> Input parser (json, yaml, toml, xml, csv, hcl, ini)
-o, --out <format> Output parser (defaults to input format)
--root Output full document after modification
--var <name>=<value> Pass variables into query (repeatable)
--compact Compact output (no pretty-printing)
--rw-flag <name>=<value> Read/write flag (e.g., --rw-flag csv-delimiter=;)
--read-flag <name>=<val> Reader flag (e.g., --read-flag xml-mode=structured)
--write-flag <name>=<val> Writer flag (e.g., --write-flag csv-delimiter=;)
-c, --config <path> Config file path (default: ~/dasel.yaml)
Core Selectors Quick Reference
| Selector |
Syntax |
Example |
| Dot notation |
foo.bar.baz |
cat f.json | dasel -i json 'foo.bar' |
| Array index |
[0], [2] |
cat f.json | dasel -i json 'items[0]' |
| Array slice |
[0:3] |
cat f.json | dasel -i json 'items[0:2]' |
| Recursive descent |
.., ..name |
cat f.json | dasel -i json '..name' |
| All values recursive |
..* |
cat f.json | dasel -i json '..*' |
| Object construction |
{ key1, key2 } |
cat f.json | dasel -i json '{ name, age }' |
| Spread |
obj... |
cat f.json | dasel -i json '{ defaults..., overrides... }' |
Key Functions Quick Reference
19 built-in functions in DefaultFuncCollection (source: execution/func.go:12-33) plus the sortBy complex expression.
| Function |
Purpose |
Example |
filter(pred) |
Filter arrays |
users.filter(active == true) |
map(expr) |
Transform arrays |
users.map(name) |
each(expr) |
Modify each element |
each($this = $this * 2) |
search(pred) |
Recursive search |
search(has("id")) |
sortBy(expr) |
Sort array |
sortBy($this, desc) |
has(key) |
Check key exists |
has("name") |
get(key) |
Get value at key/index |
get("name") |
contains(val) |
Check slice contains value |
contains(42) |
len(expr) |
Length |
len($this) |
join(sep) |
Join to string |
join(",") |
sum(expr) |
Sum numeric array |
sum($this) |
add(args...) |
Add numbers |
add(1, 2, 3) |
max(args...) |
Maximum value |
max(1, 5, 3) |
min(args...) |
Minimum value |
min(1, 5, 3) |
merge(args...) |
Merge maps |
merge(defaults, overrides) |
keys(expr) |
Get map keys |
keys($this) |
reverse(expr) |
Reverse array |
reverse($this) |
typeOf(expr) |
Get type string |
typeOf($this) |
toString(expr) |
Cast to string |
toString($this) |
toInt(expr) |
Cast to integer |
toInt($this) |
toFloat(expr) |
Cast to float |
toFloat($this) |
base64e(str) |
Base64 encode |
base64e("hello") |
base64d(str) |
Base64 decode |
base64d("aGVsbG8=") |
parse(fmt, data) |
Parse data at runtime |
parse("json", rawStr) |
readFile(path) |
Read file contents |
readFile("config.json") |
ignore() |
Exclude from branch |
ignore() |
Modification Syntax
v3 removed put and delete subcommands. Use assignment with --root:
# Set a value
echo '{"count": 1}' | dasel -i json --root 'count = 42'
# Boolean assignment
echo '{"enabled": false}' | dasel -i json --root 'enabled = true'
# Append to array
echo '[1,2,3]' | dasel -i json --root '[$this..., 4]'
# Remove key (reconstruct without it)
echo '{"keep": "yes", "drop": "no"}' | dasel -i json --root '{ keep }'
Format Conversion
# JSON to YAML
cat data.json | dasel -i json -o yaml
# YAML to TOML
cat config.yaml | dasel -i yaml -o toml
# TOML to JSON
cat config.toml | dasel -i toml -o json
Special Variables
$root -- references the root document
$this -- references the current node (inside each, map, filter, search)
Variable Assignment
# Multi-statement with semicolons
cat data.json | dasel -i json '$active = users.filter(active == true); $active.map(name)'
Conditionals
echo '{"count": 7}' | dasel -i json 'if(count > 5) { "many" } else { "few" }'
v3 Breaking Changes from v2
put and delete subcommands removed; use inline assignment with --root
-f/--file flag removed; input always comes from stdin via pipe
- Query/selector syntax completely revamped; v2 syntax is NOT compatible with v3
- CLI framework changed from Cobra to Kong
- Go module path changed to
github.com/tomwright/dasel/v3
Detailed References
- Selectors and Syntax -- dot notation, arrays, recursive descent, object construction, variables, conditionals, comparison operators
- Functions Reference -- complete function signatures, descriptions, and examples
- Format-Specific Patterns -- JSON, YAML, TOML, XML, CSV, HCL, INI patterns and conversion caveats
Sources
- dasel README: https://raw.githubusercontent.com/TomWright/dasel/master/README.md (fetched 2026-02-19)
- dasel docs: https://daseldocs.tomwright.me (fetched 2026-02-19)
- Query syntax: https://daseldocs.tomwright.me/syntax/query-syntax.md (fetched 2026-02-19)
- Functions index: https://daseldocs.tomwright.me/functions (fetched 2026-02-19)
- CHANGELOG: https://raw.githubusercontent.com/TomWright/dasel/master/CHANGELOG.md (fetched 2026-02-19)
- Releases: https://github.com/TomWright/dasel/releases (fetched 2026-02-19)
- Source code analysis:
execution/func.go, internal/cli/query.go, internal/cli/run.go, internal/cli/config.go, execution/execute_binary.go, execution/execute_unary.go (analyzed 2026-02-19)
- Fact-check: FACT_CHECK_REPORT.md (2026-02-23)
1---2name: dasel-reference3description: Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.4---5# dasel v3 Syntax Reference67Single-binary CLI for querying, modifying, and converting structured data. Replaces `jq` + `yq` + `xmllint` with one unified query syntax across all formats.89Stable version at writing (date: 2026-02-23): **v3.2.3**1011## Supported Formats1213`json`, `yaml`, `toml`, `xml`, `csv`, `hcl`, `ini`1415## Basic Usage1617```bash18# Query from stdin (format required)19echo '{"foo": "bar"}' | dasel -i json 'foo'2021# Query from file via stdin22cat config.yaml | dasel -i yaml 'database.host'2324# Modify and output full document25echo '{"port": 3000}' | dasel -i json --root 'server.port = 8080'2627# Convert formats28cat data.json | dasel -i json -o yaml29```3031## Format Handling3233dasel v3 does NOT auto-detect format from file extension. There is no `-f`/`--file` flag. Input is always read from stdin. Format must be specified explicitly with `-i` and/or `-o`. If only one is given, the other defaults to it. If neither is given, both default to `json` (configurable via `~/dasel.yaml` with `default_format` key).3435Source: `internal/cli/query.go:10-11`, `internal/cli/run.go:37-43`, `internal/cli/config.go:19-21`3637## Key Flags3839```text40-i, --in <format> Input parser (json, yaml, toml, xml, csv, hcl, ini)41-o, --out <format> Output parser (defaults to input format)42--root Output full document after modification43--var <name>=<value> Pass variables into query (repeatable)44--compact Compact output (no pretty-printing)45--rw-flag <name>=<value> Read/write flag (e.g., --rw-flag csv-delimiter=;)46--read-flag <name>=<val> Reader flag (e.g., --read-flag xml-mode=structured)47--write-flag <name>=<val> Writer flag (e.g., --write-flag csv-delimiter=;)48-c, --config <path> Config file path (default: ~/dasel.yaml)49```5051## Core Selectors Quick Reference5253| Selector | Syntax | Example |54|----------|--------|---------|55| Dot notation | `foo.bar.baz` | `cat f.json \| dasel -i json 'foo.bar'` |56| Array index | `[0]`, `[2]` | `cat f.json \| dasel -i json 'items[0]'` |57| Array slice | `[0:3]` | `cat f.json \| dasel -i json 'items[0:2]'` |58| Recursive descent | `..`, `..name` | `cat f.json \| dasel -i json '..name'` |59| All values recursive | `..*` | `cat f.json \| dasel -i json '..*'` |60| Object construction | `{ key1, key2 }` | `cat f.json \| dasel -i json '{ name, age }'` |61| Spread | `obj...` | `cat f.json \| dasel -i json '{ defaults..., overrides... }'` |6263## Key Functions Quick Reference646519 built-in functions in `DefaultFuncCollection` (source: `execution/func.go:12-33`) plus the `sortBy` complex expression.6667| Function | Purpose | Example |68|----------|---------|---------|69| `filter(pred)` | Filter arrays | `users.filter(active == true)` |70| `map(expr)` | Transform arrays | `users.map(name)` |71| `each(expr)` | Modify each element | `each($this = $this * 2)` |72| `search(pred)` | Recursive search | `search(has("id"))` |73| `sortBy(expr)` | Sort array | `sortBy($this, desc)` |74| `has(key)` | Check key exists | `has("name")` |75| `get(key)` | Get value at key/index | `get("name")` |76| `contains(val)` | Check slice contains value | `contains(42)` |77| `len(expr)` | Length | `len($this)` |78| `join(sep)` | Join to string | `join(",")` |79| `sum(expr)` | Sum numeric array | `sum($this)` |80| `add(args...)` | Add numbers | `add(1, 2, 3)` |81| `max(args...)` | Maximum value | `max(1, 5, 3)` |82| `min(args...)` | Minimum value | `min(1, 5, 3)` |83| `merge(args...)` | Merge maps | `merge(defaults, overrides)` |84| `keys(expr)` | Get map keys | `keys($this)` |85| `reverse(expr)` | Reverse array | `reverse($this)` |86| `typeOf(expr)` | Get type string | `typeOf($this)` |87| `toString(expr)` | Cast to string | `toString($this)` |88| `toInt(expr)` | Cast to integer | `toInt($this)` |89| `toFloat(expr)` | Cast to float | `toFloat($this)` |90| `base64e(str)` | Base64 encode | `base64e("hello")` |91| `base64d(str)` | Base64 decode | `base64d("aGVsbG8=")` |92| `parse(fmt, data)` | Parse data at runtime | `parse("json", rawStr)` |93| `readFile(path)` | Read file contents | `readFile("config.json")` |94| `ignore()` | Exclude from branch | `ignore()` |9596## Modification Syntax9798v3 removed `put` and `delete` subcommands. Use assignment with `--root`:99100```bash101# Set a value102echo '{"count": 1}' | dasel -i json --root 'count = 42'103104# Boolean assignment105echo '{"enabled": false}' | dasel -i json --root 'enabled = true'106107# Append to array108echo '[1,2,3]' | dasel -i json --root '[$this..., 4]'109110# Remove key (reconstruct without it)111echo '{"keep": "yes", "drop": "no"}' | dasel -i json --root '{ keep }'112```113114## Format Conversion115116```bash117# JSON to YAML118cat data.json | dasel -i json -o yaml119120# YAML to TOML121cat config.yaml | dasel -i yaml -o toml122123# TOML to JSON124cat config.toml | dasel -i toml -o json125```126127## Special Variables128129- `$root` -- references the root document130- `$this` -- references the current node (inside `each`, `map`, `filter`, `search`)131132## Variable Assignment133134```bash135# Multi-statement with semicolons136cat data.json | dasel -i json '$active = users.filter(active == true); $active.map(name)'137```138139## Conditionals140141```bash142echo '{"count": 7}' | dasel -i json 'if(count > 5) { "many" } else { "few" }'143```144145## v3 Breaking Changes from v2146147- `put` and `delete` subcommands removed; use inline assignment with `--root`148- `-f`/`--file` flag removed; input always comes from stdin via pipe149- Query/selector syntax completely revamped; v2 syntax is NOT compatible with v3150- CLI framework changed from Cobra to Kong151- Go module path changed to `github.com/tomwright/dasel/v3`152153## Detailed References154155- [Selectors and Syntax](./references/selectors-and-syntax.md) -- dot notation, arrays, recursive descent, object construction, variables, conditionals, comparison operators156- [Functions Reference](./references/functions.md) -- complete function signatures, descriptions, and examples157- [Format-Specific Patterns](./references/format-patterns.md) -- JSON, YAML, TOML, XML, CSV, HCL, INI patterns and conversion caveats158159## Sources1601611. **dasel README**: <https://raw.githubusercontent.com/TomWright/dasel/master/README.md> (fetched 2026-02-19)1622. **dasel docs**: <https://daseldocs.tomwright.me> (fetched 2026-02-19)1633. **Query syntax**: <https://daseldocs.tomwright.me/syntax/query-syntax.md> (fetched 2026-02-19)1644. **Functions index**: <https://daseldocs.tomwright.me/functions> (fetched 2026-02-19)1655. **CHANGELOG**: <https://raw.githubusercontent.com/TomWright/dasel/master/CHANGELOG.md> (fetched 2026-02-19)1666. **Releases**: <https://github.com/TomWright/dasel/releases> (fetched 2026-02-19)1677. **Source code analysis**: `execution/func.go`, `internal/cli/query.go`, `internal/cli/run.go`, `internal/cli/config.go`, `execution/execute_binary.go`, `execution/execute_unary.go` (analyzed 2026-02-19)1688. **Fact-check**: [FACT_CHECK_REPORT.md](./FACT_CHECK_REPORT.md) (2026-02-23)