dasel v3 语法参考
单一二进制 CLI,用于查询、修改和转换结构化数据。用一个统一的查询语法替代 jq + yq + xmllint,支持所有格式。
撰写时的稳定版本(日期:2026-02-23):v3.2.3
支持格式
json、yaml、toml、xml、csv、hcl、ini
基本用法
# 从标准输入查询(需指定格式)
echo '{"foo": "bar"}' | dasel -i json 'foo'
# 从文件通过标准输入查询
cat config.yaml | dasel -i yaml 'database.host'
# 修改并输出完整文档
echo '{"port": 3000}' | dasel -i json --root 'server.port = 8080'
# 转换格式
cat data.json | dasel -i json -o yaml
格式处理
dasel v3 不会根据文件扩展名自动检测格式。没有 -f/--file 标志。输入始终从标准输入读取。必须通过 -i 和/或 -o 显式指定格式。如果只指定一个,另一个默认与其相同。如果两者都未指定,则都默认为 json(可通过 ~/dasel.yaml 中的 default_format 键配置)。
来源:internal/cli/query.go:10-11、internal/cli/run.go:37-43、internal/cli/config.go:19-21
关键标志
-i, --in <format> 输入解析器(json、yaml、toml、xml、csv、hcl、ini)
-o, --out <format> 输出解析器(默认为输入格式)
--root 修改后输出完整文档
--var <name>=<value> 向查询传递变量(可重复)
--compact 紧凑输出(不进行美化打印)
--rw-flag <name>=<value> 读写标志(例如 --rw-flag csv-delimiter=;)
--read-flag <name>=<val> 读取器标志(例如 --read-flag xml-mode=structured)
--write-flag <name>=<val> 写入器标志(例如 --write-flag csv-delimiter=;)
-c, --config <path> 配置文件路径(默认:~/dasel.yaml)
核心选择器快速参考
| 选择器 | 语法 | 示例 |
|---|---|---|
| 点号表示法 | foo.bar.baz | cat f.json | dasel -i json 'foo.bar' |
| 数组索引 | [0]、[2] | cat f.json | dasel -i json 'items[0]' |
| 数组切片 | [0:3] | cat f.json | dasel -i json 'items[0:2]' |
| 递归下降 | ..、..name | cat f.json | dasel -i json '..name' |
| 递归所有值 | ..* | cat f.json | dasel -i json '..*' |
| 对象构造 | { key1, key2 } | cat f.json | dasel -i json '{ name, age }' |
| 展开 | obj... | cat f.json | dasel -i json '{ defaults..., overrides... }' |
关键函数快速参考
DefaultFuncCollection 中有 19 个内置函数(来源:execution/func.go:12-33),加上 sortBy 复杂表达式。
| 函数 | 用途 | 示例 |
|---|---|---|
filter(pred) | 过滤数组 | users.filter(active == true) |
map(expr) | 转换数组 | users.map(name) |
each(expr) | 修改每个元素 | each($this = $this * 2) |
search(pred) | 递归搜索 | search(has("id")) |
sortBy(expr) | 排序数组 | sortBy($this, desc) |
has(key) | 检查键是否存在 | has("name") |
get(key) | 获取键/索引处的值 | get("name") |
contains(val) | 检查切片是否包含值 | contains(42) |
len(expr) | 长度 | len($this) |
join(sep) | 连接为字符串 | join(",") |
sum(expr) | 对数值数组求和 | sum($this) |
add(args...) | 数字相加 | add(1, 2, 3) |
max(args...) | 最大值 | max(1, 5, 3) |
min(args...) | 最小值 | min(1, 5, 3) |
merge(args...) | 合并映射 | merge(defaults, overrides) |
keys(expr) | 获取映射键 | keys($this) |
reverse(expr) | 反转数组 | reverse($this) |
typeOf(expr) | 获取类型字符串 | typeOf($this) |
toString(expr) | 转换为字符串 | toString($this) |
toInt(expr) | 转换为整数 | toInt($this) |
toFloat(expr) | 转换为浮点数 | toFloat($this) |
base64e(str) | Base64 编码 | base64e("hello") |
base64d(str) | Base64 解码 | base64d("aGVsbG8=") |
parse(fmt, data) | 运行时解析数据 | parse("json", rawStr) |
readFile(path) | 读取文件内容 | readFile("config.json") |
ignore() | 从分支中排除 | ignore() |
修改语法
v3 移除了 put 和 delete 子命令。改用赋值与 --root:
# 设置值
echo '{"count": 1}' | dasel -i json --root 'count = 42'
# 布尔赋值
echo '{"enabled": false}' | dasel -i json --root 'enabled = true'
# 追加到数组
echo '[1,2,3]' | dasel -i json --root '[$this..., 4]'
# 移除键(不包含它重新构造)
echo '{"keep": "yes", "drop": "no"}' | dasel -i json --root '{ keep }'
格式转换
# JSON 转 YAML
cat data.json | dasel -i json -o yaml
# YAML 转 TOML
cat config.yaml | dasel -i yaml -o toml
# TOML 转 JSON
cat config.toml | dasel -i toml -o json
特殊变量
$root—— 引用根文档$this—— 引用当前节点(在each、map、filter、search内部)
变量赋值
# 分号分隔的多语句
cat data.json | dasel -i json '$active = users.filter(active == true); $active.map(name)'
条件
echo '{"count": 7}' | dasel -i json 'if(count > 5) { "many" } else { "few" }'
v3 与 v2 的重大变更
- 移除了
put和delete子命令;改用内联赋值与--root - 移除了
-f/--file标志;输入始终通过管道从标准输入获取 - 查询/选择器语法完全重写;v2 语法与 v3 不兼容
- CLI 框架从 Cobra 改为 Kong
- Go 模块路径改为
github.com/tomwright/dasel/v3
详细参考
- 选择器与语法 —— 点号表示法、数组、递归下降、对象构造、变量、条件、比较运算符
- 函数参考 —— 完整的函数签名、描述和示例
- 格式特有模式 —— JSON、YAML、TOML、XML、CSV、HCL、INI 模式和转换注意事项
来源
- dasel README:https://raw.githubusercontent.com/TomWright/dasel/master/README.md(获取于 2026-02-19)
- dasel 文档:https://daseldocs.tomwright.me(获取于 2026-02-19)
- 查询语法:https://daseldocs.tomwright.me/syntax/query-syntax.md(获取于 2026-02-19)
- 函数索引:https://daseldocs.tomwright.me/functions(获取于 2026-02-19)
- 变更日志:https://raw.githubusercontent.com/TomWright/dasel/master/CHANGELOG.md(获取于 2026-02-19)
- 发布版本:https://github.com/TomWright/dasel/releases(获取于 2026-02-19)
- 源代码分析:
execution/func.go、internal/cli/query.go、internal/cli/run.go、internal/cli/config.go、execution/execute_binary.go、execution/execute_unary.go(分析于 2026-02-19) - 事实核查:FACT_CHECK_REPORT.md(2026-02-23)