Как получить конкретное значение из файла JSON? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть JSON-файл и содержимое, как показано ниже:

[  
       {  
          "id":"54545-f919-4b0f-930c-0117d6e6c987",
          "name":"Inventory_Groups",
          "path":"/Groups",
          "subGroups":[  
             {  
                "id":"343534-394b-429a-834e-f8774240d736",
                "name":"UserGroup",
                "path":"/Groups/UserGroup",
                "subGroups":[  

                ]
             }
          ]
       }
    ]

Теперь я хочу grep значение ключа id из области subGroups. Как этого добиться, если id ключ не дублируется, то это может быть достигнуто с помощью:

grep -o '"id": "[^"]*' Group.json | grep -o '[^"]*$'

Но как в моем случае получить значение id, как оно появляется два раза?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Правильный вопрос, который следует задать своему работодателю, заключается в том, почему вы можете использовать оболочку, но не использовать соответствующие пакеты linux.Сравните:

awk -F '[":,]+' '$2=="subGroups" {f=1} f && $2=="id" {print $3; exit}' file

(хрупкое решение, потерпит неудачу, если структура вашего JSON изменится)

To:

jq '.[].subGroups[].id' file

, который может работать с компактным JSON в дополнение кмножество других реалистических осложнений.

0 голосов
/ 24 июня 2019

Используя только стандартные инструменты UNIX и предполагая, что ваш sed может допускать ввод без завершающей строки (в противном случае мы можем поменять tr на команду awk, которая сохраняет последнюю строку):

$ tr -d '\n' < file | sed 's/.*"subGroups":[^]}]*"id":"\([^"]*\)\".*/\1\n/'
343534-394b-429a-834e-f8774240d736

В качестве альтернативы, просто позвонив на любой awk:

$ awk '
    { rec = (NR>1 ? rec ORS : "") $0 }
    END {
        gsub(/.*"subGroups":[^]}]*"id":"|".*/,"",rec)
        print rec
    }
' file
343534-394b-429a-834e-f8774240d736
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...