本文作者:icy

go-# 告别繁琐的 JSON/YAML 转换:Dasel —— 像使用 jq 一样处理所有配置文件的万能工具

icy 今天 9 抢沙发
go-# 告别繁琐的 JSON/YAML 转换:Dasel —— 像使用 jq 一样处理所有配置文件的万能工具摘要: 在现代的 DevOps 和云原生开发中,我们每天都在与各种格式的配置文件打交道:JSON 用于 API 响应,YAML 用于 Kubernetes 配置,XML 用于旧版系统,而...

go-# 告别繁琐的 JSON/YAML 转换:Dasel —— 像使用 jq 一样处理所有配置文件的万能工具

在现代的 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 文件:

text
server:
  port: 8080
  timeout: 30s
  endpoints:
    - /api/v1
    - /api/v2
database:
  user: admin

需求:获取服务器的端口号。 命令

text
dasel get -f config.yaml "server.port"
# 输出: 8080

需求:获取第二个 endpoint。 命令

text
dasel get -f config.yaml "server.endpoints[1]"
# 输出: /api/v2

场景二:跨格式转换(YAML \(\rightarrow\) JSON)

这是 Dasel 最常用的功能之一。在 CI/CD 流水线中,经常需要将 YAML 配置转换为 JSON 传递给其他工具。

命令

text
dasel read -f config.yaml | dasel write -f - -o json

注:read 将内容转换为 Dasel 内部格式,write 将其输出为指定格式。


场景三:动态修改配置文件(原地更新)

在自动化部署脚本中,我们经常需要修改镜像版本或环境变量。

需求:将 server.port 修改为 9090命令

text
dasel set -f config.yaml "server.port" 9090

执行后,config.yaml 文件会被直接更新,无需手动编辑。


场景四:处理复杂的 XML 文件

XML 总是让人头疼,但 Dasel 将其简化为路径操作。 假设有 data.xml

text
<root>
  <user id="1">
    <name>Alice</name>
  </user>
  <user id="2">
    <name>Bob</name>
  </user>
</root>

需求:获取第二个用户的姓名。 命令

text
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?

你可能会问:“我已经有了 jqyq,为什么还需要 Dasel?”

  1. 统一性jq 仅限 JSON,yq 虽然支持 YAML,但不同版本的 yq(Python 版 vs Go 版)语法完全不同。Dasel 提供了一套在所有支持格式中通用的标准。
  2. 学习成本jq 的过滤器语法(如 map, select)非常强大但极其复杂。Dasel 采用了更接近编程语言对象访问的路径语法,几乎零学习成本。
  3. 互操作性:Dasel 旨在成为一个“管道”工具。你可以轻松地将 XML 转换为 JSON,再通过 Dasel 修改,最后输出为 TOML。

安装方式

如果你已经安装了 Go 环境,可以通过以下命令快速安装:

text
go install github.com/TomWright/dasel@latest

或者通过二进制发行版直接下载。

总结

Dasel 是一个典型的“小而美”的工具。它不试图取代所有复杂的数据处理逻辑,但它极大地简化了我们在多种配置格式之间切换的痛苦。

无论你是需要编写一个自动更新 K8s 镜像版本的 Shell 脚本,还是需要快速预览一个复杂的 XML 配置文件,Dasel 都能以最简洁的命令完成任务。

dasel_20260510220015.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/golang/980.html发布于 今天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,9人围观)参与讨论

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