首页 > 解决方案 > 如何使用带有内置 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_customisedweb-software、 )。可能有更多包含作为子字符串的存储库。web-loy-confgitweb

我想对具有子字符串的存储库执行一些操作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) 并且能够遍历该名称

标签: jsonshellsedsh

解决方案


您可以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);

推荐阅读