json - 如何使用带有内置 linux 工具(如 sed)的 shell 脚本在 json 文本中查找键值对?
问题描述
我有一个abc.json
包含文本的 JSON 文件:
{
"size": 3,
"limit": 25,
"isLastPage": true,
"values": [
{
"slug": "docker_apache_customised",
"id": 234889,
"name": "docker_apache_customised",
"scmId": "git",
"state": "AVAILABLE",
"statusMessage": "Available",
"forkable": true,
"project": {
"key": "UFD",
"id": 36239,
"name": "UF_docker",
"public": false,
"type": "NORMAL",
"links": {
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD"
}]
}
},
"public": false,
"links": {
"clone": [{
"href": "https://rndwww.abc.xxx.net/git/scm/ufd/docker_apache_customised.git",
"name": "http"
}, {
"href": "ssh://git@git.rnd.xxx.net/ufd/docker_apache_customised.git",
"name": "ssh"
}],
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD/repos/docker_apache_customised/browse"
}]
}
},
{
"slug": "web-software",
"id": 241533,
"name": "web-software",
"scmId": "git",
"state": "AVAILABLE",
"statusMessage": "Available",
"forkable": true,
"project": {
"key": "UFD",
"id": 36239,
"name": "UF_docker",
"public": false,
"type": "NORMAL",
"links": {
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD"
}]
}
},
"public": false,
"links": {
"clone": [{
"href": "https://rndwww.abc.xxx.net/git/scm/ufd/web-software.git",
"name": "http"
}, {
"href": "ssh://git@git.rnd.xxx.net/ufd/web-software.git",
"name": "ssh"
}],
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD/repos/web-software/browse"
}]
}
},
{
"slug": "web-loy-conf",
"id": 240959,
"name": "web-loy-conf",
"scmId": "git",
"state": "AVAILABLE",
"statusMessage": "Available",
"forkable": true,
"project": {
"key": "UFD",
"id": 36239,
"name": "UF_docker",
"public": false,
"type": "NORMAL",
"links": {
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD"
}]
}
},
"public": false,
"links": {
"clone": [{
"href": "ssh://git@git.rnd.xxx.net/ufd/web-loy-conf.git",
"name": "ssh"
}, {
"href": "https://rndwww.abc.xxx.net/git/scm/ufd/web-loy-conf.git",
"name": "http"
}],
"self": [{
"href": "https://rndwww.abc.xxx.net/git/projects/UFD/repos/web-loy-conf/browse"
}]
}
}
],
"start": 0
}
此文本在一个项目中包含三个存储库(名为docker_apache_customised
、web-software
、 )。可能有更多包含作为子字符串的存储库。web-loy-conf
git
web
我想对具有子字符串的存储库执行一些操作web
,为此我认为我必须在 shell 脚本中应用一个 for 循环。我不想使用jq
工具
我使用 external tool 编写了一个脚本jq
,但我只想使用 Linux 内置工具来完成。使用的脚本jq
工作正常:
for k in $(jq '.values | keys | .[]' abc.json); do
value=$(jq -r ".values[$k]" abc.json);
name=$(jq -r '.name' <<< "$value");
if [[ $name == *"web"* ]]; then
#MYLOGIC
done
done
预期结果是名称 ( web-software
, web-loy-conf
) 并且能够遍历该名称
解决方案
您可以jq
从 git 存储库中的当前路径运行,无需将其复制到 PATH 中的目录。添加执行权限后:
value=$(<path to jq in git dir>/jq -r ".values[$k]" abc.json);
您可以使其相对于 git 存储库根目录
value=$(./<path to jq from git repo root>/jq -r ".values[$k]" abc.json);
此外,您可以在变量中设置它的路径
jqbin='./<path to jq from git repo root>/jq'
value=$($jqbin -r ".values[$k]" abc.json);
推荐阅读
- mysql - Delphi Unidac MySQL 从备忘录代码语法错误创建触发器
- python - 执行带参数的python脚本
- node.js - 虚拟机中的 NPM 安装问题
- javascript - @HostListener 用于自动填充 Angular 中的输入字段
- python - Pillow 处理 JPG 格式
- javascript - Angular:尝试在 iframe 内的 img src 中显示资产图像会给出 404
- python - 为什么滚动应用这么慢?
- c# - Orchestrator 功能失败:活动功能失败:“无法解析功能名称”
- mips - 寄存器中的基数和偏移量
- reactjs - react-onesignal:通知提示后订阅 Onesignal