使用 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.txt
和 jq '.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":{
开头的数据,之后第一次出现 }
- 所以如果标签本身可以包含 }
我正在为可在 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.txt
和 jq '.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":{
开头的数据,之后第一次出现}
- 所以如果标签本身可以包含}