我正在开发一个可在 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/