Dasel v3 是一个用于查询、修改和转换结构化数据文件的命令行工具,其核心特点是在不同数据格式之间使用一致的查询语法。
用途
Dasel 主要用于对 JSON、YAML、TOML、XML、CSV、HCL、INI 等结构化数据文件进行读取、修改和格式转换。它从标准输入读取数据,通过查询表达式选取或变更数据,再输出为指定格式。
主要能力
- 跨格式查询:使用统一的点链式访问器与函数调用语法,读取嵌套字段、数组索引、范围切片等。
- 修改数据:支持赋值(如 user.name = "Alice"),配合 --root 输出完整文档。
- 格式转换:读取一种格式并输出为另一种格式,例如 JSON 转 YAML、YAML 转 TOML。
- 过滤与变换:提供 filter、map、each、search 等函数,对数组进行筛选、映射、原地修改和递归谓词搜索。
- 对象构建与展开:支持构建新对象、使用展开运算符合并对象或追加数组元素。
- 多语句查询:使用分号分隔多条语句,最后一条语句作为输出。
- 环境变量:可在查询中引用环境变量。
- 内置函数:包括 has、len、keys、add、join、replace、sortBy、reverse、min、max、sum、toString、toInt、typeOf、parse、readFile、base64e、base64d 等。
使用方式
基本用法为通过标准输入传入数据并指定输入格式,例如:
echo '{"name":"Tom"}' | dasel -i json 'name'
从文件读取可通过重定向:
dasel -i yaml 'database.host' < config.yaml
格式转换示例:
cat data.json | dasel -i json -o yaml
修改数据并输出完整文档:
echo '{"a":1}' | dasel -i json --root 'a = 2'
原地编辑文件需先写入临时文件再替换:
dasel -i yaml --root 'server.port = 9090' < config.yaml > config.yaml.tmp && mv config.yaml.tmp config.yaml
常用标志包括:-i/--in 指定输入格式,-o/--out 指定输出格式,--root 输出完整文档,--var 传入命名变量,--read-flag 与 --write-flag 设置解析器读写选项,-c/--config 指定配置文件(默认 ~/dasel.yaml),--unstable 启用实验性功能。
查询语法由点链式访问器和函数调用组成,多条语句以分号结尾。$root 表示标准输入文档,$this 表示当前元素。支持条件表达式(if/else)、默认值合并(??)、递归下降(..name、..*)等。
适用场景
适用于需要在命令行中快速读取、筛选、修改或转换多种结构化配置与数据文件的场景,例如修改 YAML 配置、从 JSON 提取字段、在格式之间转换数据、对数组进行过滤和映射等。
限制
- v3 没有用于数据文件的 -f 标志,必须使用标准输入(< file 或 cat file |)。
- 原地编辑文件时必须先重定向到临时文件再移动,因为 bash 会在 dasel 读取前截断目标文件。
- 三元运算符(? :)尚未实现,需使用 if/else 形式。
- branch 功能不稳定,需要 --unstable 标志。
- CSV 所有值均按字符串处理;INI 仅支持基本节与键值;TOML 映射未排序。
- XML 需使用 --read-flag xml-mode=structured;CSV 可用 --read-flag csv-delimiter=;HCL 可用 --read-flag hcl-block-format=array。
更多细节可参考随附的 references/syntax.md、references/functions.md、references/input-output.md。