使用 BusyBox 工具解析 JSON

Parsing JSON with BusyBox tools

我正在为可在 Android(通过 Termux 的 BusyBox)上安装 Hugo 的博客主题工作,并计划创建一个 BusyBox Docker 图像并将我的主题和 hugo 二进制文件复制到它在 ARM 上使用。

主题版本已存档并在 NPM 上可用,BusyBox 上的 tools available 使我能够从 JSON:

的元数据中可靠地解析 version
meta=$(wget -qO - https://registry.npmjs.org/package/latest)
vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')

现在我想将 meta 中的 dist 值复制到一个文本文件中以便在 Hugo 中使用:

"dist": {
  "integrity": "sha512-3MH2/UKYPjr+CTC85hWGg/N3GZmSlgBWXzdXHroDfJRnEmcBKkvt1oiadN8gzCCppqCQhwtmengZzg0imm1mtg==",
  "shasum": "a159699b1c5fb006a84457fcdf0eb98d72c2eb75",
  "tarball": "https://registry.npmjs.org/after-dark/-/after-dark-6.4.1.tgz",
  "fileCount": 98,
  "unpackedSize": 5338189
},

为了清楚起见,上面的印刷很漂亮。 actual metadata 已压缩。

有没有办法重用上面的 version 解析逻辑来提取 dist 字段值?

正确的稳健解析需要像 jq 这样的工具,它可以像 jq '.version' ip.txtjq '.dist' ip.txt

一样简单

您可以使用 sed,但风险自负

$ sed -n 's/.*"version":"\([^"]*\).*//p' ip.txt
6.4.1

$ sed -n 's/.*\("dist":{[^}]*}\).*//p' ip.txt
"dist":{"integrity":....
....}
  • -n 禁用自动打印的选项
  • 带有 s 命令的 p 修饰符将允许仅在替换成功时打印,这意味着当出现问题时输出为空而不是整个输入行
  • .*"version":"\([^"]*\).* 这将匹配整行,捕获 version 标记后双引号之间的数据 - 如果允许空格和其他有效的 json 格式,则必须调整正则表达式
  • .*\("dist":{[^}]*}\).* 这将匹配整行,捕获以 "dist":{ 开头的数据,之后第一次出现 } - 所以如果标签本身可以包含 }