【问题标题】:Parsing JSON with BusyBox tools使用 BusyBox 工具解析 JSON
【发布时间】:2018-08-24 07:50:21
【问题描述】:

我正在开发一个可在 Android 上安装的 Hugo 博客主题(通过 Termux 的 BusyBox),并计划创建一个 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 '" ')

现在我想将 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 字段值?

【问题讨论】:

    标签: json regex grep cut busybox


    【解决方案1】:

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

    【讨论】:

    • 成功了。谢谢,桑迪普。想把它移植到 BSD sed 上吗?
    • 我没有 BSD sed 来测试它,但我觉得这应该适用于任何 sed...请参阅stackoverflow.com/questions/24275070/… 以获得更多帮助..
    • 两者中的第一个在 BSD 上工作,而第二个导致空输出。两者都可以在 BusyBox 上正常工作,这正是我所要求的。我将使用您提供的相关链接深入研究 sed 的差异。再次感谢您的帮助。
    猜你喜欢
    • 2022-05-19
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多