json - 使用 BusyBox 工具解析 JSON

标签 json regex grep cut busybox

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

主题版本已存档并在 NPM 和 tools available 上提供。在 BusyBox 上,我可以可靠地解析 version来自 JSON 的元数据:

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

现在我想复制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
},

为清晰起见,上面打印得很漂亮。 actual metadata被压缩。

有什么方法可以重复使用 version上面的解析逻辑也拉出 dist字段值?

最佳答案

正确的健壮解析需要像 jq 这样的工具它可以像 jq '.version' ip.txt 一样简单和 jq '.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":....
....}
  • -n禁用自动打印的选项
  • p修饰符 s命令仅在替换成功时才允许打印,这意味着当出现问题时输出为空而不是整个输入行
  • .*"version":"\([^"]*\).*这将匹配整行,在 version 之后捕获双引号之间的数据标签 - 如果允许空格和其他有效的 json 格式,您必须调整正则表达式
  • .*\("dist":{[^}]*}\).*这将匹配整行,捕获以 "dist":{ 开头的数据第一次出现 }之后 - 所以这不适合如果标签本身可以包含 }
  • 关于json - 使用 BusyBox 工具解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999824/

    相关文章:

    java - 反序列化为动态 Java 类型

    html - 解码特殊字符 "ì"

    javascript - Backbone.js fetch() 在服务器实例中返回对象而不是子对象,但在本地实例中检索子对象

    regex - 将输出与正则表达式进行比较时,如何在 bash 中保留换行符?

    regex - 如果模式在中间 linux 中,则在两个字符串之间进行 grep

    linux - 使用 grep 命令指定特定年份之间的日期

    regex - 查找开头 t= 之后的整数

    json - 如何在 MarkLogic 的 XQuery 中以编程方式创建 JSON?

    mysql - 如何在 ActionScript 3 中替换闭括号和左括号之间的逗号

    javascript - 正则表达式仅删除单词末尾的字符 - js