使用 BusyBox 工具解析 JSON

Jos*_*das 5 regex grep json cut busybox

我正在开发一个可在 Android 上安装的 Hugo 博客主题(通过 Termux 的 BusyBox),并计划创建一个 BusyBox Docker 映像,并将我的主题和 Hugo 二进制文件复制到其中,以便在 ARM 上使用。

主题版本已存档并可在 NPM 上使用,而BusyBox 上提供的工具使我能够可靠地解析versionJSON 中的元数据:

meta=$(wget -qO - https://registry.npmjs.org/package/latest)
vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')
Run Code Online (Sandbox Code Playgroud)

现在我想将dist值从复制meta到文本文件中以在 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
},
Run Code Online (Sandbox Code Playgroud)

为了清晰起见,上面印刷得很漂亮。实际的元数据是压缩的。

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

Sun*_*eep 5

正确的稳健解析需要像这样jq简单的工具:jq '.version' ip.txtjq '.dist' ip.txt

您可以使用sed,但使用它的风险由您自行承担

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

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