使用 Dasel v3 进行数据转换
<when_to_use>
当以下情况时激活此技能:
- 修改配置文件中的值(YAML, TOML, JSON, XML, HCL, INI)
- 在数据格式之间转换(JSON 转 YAML, TOML 转 JSON 等)
- 批量更新数组元素(价格、版本、标志)
- 追加、移除或重塑数据结构
- 合并对象或从现有数据中构建新结构
</when_to_use>
安全规则
绝对不要将输出重定向到同一个输入文件。 这会在 dasel 读取之前截断文件,导致数据丢失:
# 错误——会破坏输入
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
覆盖前务必验证。 先预览转换输出,再重定向:
# 预览
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
核心修改语法
在 dasel v3 中,put 和 delete 子命令已不存在。所有修改都使用带 --root 的赋值表达式来输出完整文档。
设置值
# 输出更改了一个字段的完整文档
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"'
设置嵌套值
cat config.yaml | dasel -i yaml --root 'database.connection.host = "db.example.com"'
cat config.yaml | dasel -i yaml --root 'database.connection.port = 5432'
原地修改(安全模式)
# 单个字段更新
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
格式转换
通过管道传递 dasel 并使用不同的输入/输出格式标志:
# JSON 转 YAML
cat data.json | dasel -i json -o yaml > data.yaml
# YAML 转 TOML
cat config.yaml | dasel -i yaml -o toml > config.toml
# JSON 转 XML
cat data.json | dasel -i json -o xml > data.xml
# TOML 转 JSON
cat config.toml | dasel -i toml -o json > config.json
# CSV 转 JSON
cat data.csv | dasel -i csv -o json > data.json
数组操作
追加到数组
# 在数组末尾添加元素
echo '[1,2,3]' | dasel -i json --root '[$this..., 4]'
# 输出: [1, 2, 3, 4]
# 向数组追加对象
cat data.json | dasel -i json --root 'items = [$root.items..., {"name": "new", "value": 42}]'
使用 each 批量更新
# 将所有价格乘以 1.1(增加 10%)
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)'
过滤后转换
# 只获取活跃用户,然后提取名字
cat data.json | dasel -i json 'users.filter(active == true).map(name)'
对象操作
通过展开合并
# 向现有对象添加新键
cat base.json | dasel -i json --root '{ $root..., "newKey": "value" }'
# 合并两个对象
cat base.json | dasel -i json --root '{ $root..., "extra": true, "version": 2 }'
通过重建删除字段
由于 v3 没有 delete 命令,通过构建仅包含所需键的新对象来移除字段:
# 只保留 "name" 和 "email",丢弃其他所有内容
echo '{"name":"a","email":"b","password":"c"}' | dasel -i json --root '{ name, email }'
通过重建重命名字段
echo '{"old_name": "value"}' | dasel -i json --root '{ "new_name": old_name }'
多步骤转换
使用变量赋值和分号进行复杂操作:
# 将中间结果存储在变量中,然后转换
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'
条件转换
# 根据条件设置值
cat data.json | dasel -i json --root 'if(count > 5) { status = "many" } else { status = "few" }'
转换模式
关于详细按用例的转换模式(配置更新、批量处理、格式迁移、数据重塑、错误处理),请参阅 转换模式。
参考
- Dasel v3 文档(获取于 2026-02-19)
- Dasel 展开运算符(获取于 2026-02-19)
- Dasel each() 函数(获取于 2026-02-19)
- Dasel filter() 函数(获取于 2026-02-19)
- Dasel CHANGELOG(获取于 2026-02-19)