在现代的 DevOps 和云原生开发中,我们每天都在与各种格式的配置文件打交道:JSON 用于 API 响应,YAML 用于 Kubernetes 配置,XML 用于旧版系统,而 TOML 则常出现在 Go 项目的配置中。
如果你曾经为了修改一个 YAML 文件中的某个字段而写了一长串 Python 脚本,或者在尝试用 jq 处理 YAML 时感到崩溃,那么 Dasel 就是为你准备的救星。
什么是 Dasel?
Dasel 是一个用 Go 语言编写的轻量级命令行工具,它的核心目标是:提供一种统一的语法,用于查询、修改和转换多种数据格式的文件。
简单来说,Dasel 就像是一个“通用版”的 jq。它不关心你的输入文件是 JSON、YAML、TOML 还是 XML,它使用一套统一的选择器(Selector)语法来操作这些数据。
核心特性
- 多格式支持:原生支持 JSON, YAML, TOML, XML。
- 统一语法:无论输入格式如何,查询和修改的语法完全一致。
- 原地修改:支持直接修改文件内容并保存,无需通过临时文件中转。
- 零依赖:编译后为单个二进制文件,部署极其简单。
- 强大的选择器:支持深层嵌套路径、数组索引以及复杂的过滤逻辑。
快速上手实例
为了让你快速感受到 Dasel 的威力,我们准备了几个典型的使用场景。
场景一:从 YAML 中提取特定值
假设你有一个 config.yaml 文件:
server:
port: 8080
timeout: 30s
endpoints:
- /api/v1
- /api/v2
database:
user: admin
需求:获取服务器的端口号。 命令:
dasel get -f config.yaml "server.port" # 输出: 8080
需求:获取第二个 endpoint。 命令:
dasel get -f config.yaml "server.endpoints[1]" # 输出: /api/v2
场景二:跨格式转换(YAML \(\rightarrow\) JSON)
这是 Dasel 最常用的功能之一。在 CI/CD 流水线中,经常需要将 YAML 配置转换为 JSON 传递给其他工具。
命令:
dasel read -f config.yaml | dasel write -f - -o json
注:read 将内容转换为 Dasel 内部格式,write 将其输出为指定格式。
场景三:动态修改配置文件(原地更新)
在自动化部署脚本中,我们经常需要修改镜像版本或环境变量。
需求:将 server.port 修改为 9090。
命令:
dasel set -f config.yaml "server.port" 9090
执行后,config.yaml 文件会被直接更新,无需手动编辑。
场景四:处理复杂的 XML 文件
XML 总是让人头疼,但 Dasel 将其简化为路径操作。
假设有 data.xml:
<root>
<user id="1">
<name>Alice</name>
</user>
<user id="2">
<name>Bob</name>
</user>
</root>
需求:获取第二个用户的姓名。 命令:
dasel get -f data.xml "root.user[1].name" # 输出: Bob
核心语法详解
1. 选择器 (Selectors)
Dasel 使用点号 . 来表示层级,方括号 [] 来表示索引。
a.b.c\(\rightarrow\) 访问嵌套对象。list[0]\(\rightarrow\) 访问数组第一个元素。list[*]\(\rightarrow\) 匹配数组中的所有元素。
2. 常用命令对比
| 命令 | 作用 | 典型用法 |
|---|---|---|
get |
提取值 | dasel get -f file.json "path.to.value" |
set |
修改/添加值 | dasel set -f file.yaml "key" "new_value" |
delete |
删除键值对 | dasel delete -f file.toml "old_key" |
read |
读取并标准化 | dasel read -f file.yaml |
write |
格式化输出 | dasel write -o json |
为什么选择 Dasel 而不是 jq 或 yq?
你可能会问:“我已经有了 jq 或 yq,为什么还需要 Dasel?”
- 统一性:
jq仅限 JSON,yq虽然支持 YAML,但不同版本的yq(Python 版 vs Go 版)语法完全不同。Dasel 提供了一套在所有支持格式中通用的标准。 - 学习成本:
jq的过滤器语法(如map,select)非常强大但极其复杂。Dasel 采用了更接近编程语言对象访问的路径语法,几乎零学习成本。 - 互操作性:Dasel 旨在成为一个“管道”工具。你可以轻松地将 XML 转换为 JSON,再通过 Dasel 修改,最后输出为 TOML。
安装方式
如果你已经安装了 Go 环境,可以通过以下命令快速安装:
go install github.com/TomWright/dasel@latest
或者通过二进制发行版直接下载。
总结
Dasel 是一个典型的“小而美”的工具。它不试图取代所有复杂的数据处理逻辑,但它极大地简化了我们在多种配置格式之间切换的痛苦。
无论你是需要编写一个自动更新 K8s 镜像版本的 Shell 脚本,还是需要快速预览一个复杂的 XML 配置文件,Dasel 都能以最简洁的命令完成任务。



还没有评论,来说两句吧...