2015-07-28 9 views
0

У меня есть JSON-файл с такими Подробно в нем (не полный файл):JSON файл разбор с помощью JQ

{"property": [ 
    { 

{ 
     "name": "test1", 
     "value": "{\"test_type\":\"jsystem\",\"order\":1,\"test_id\":\"test_01\",\"physical_setup_id\":\"prd_01\",\"timeout\":\"20\"}", 
     "own": true 
    }, 
    { 
     "name": "test2", 
     "value": "{\"test_type\":\"jsystem\",\"order\":2,\"test_id\":\"test_02\",\"physical_setup_id\":\"prd_02\",\"timeout\":\"30\"}", 
     "own": true 
    }, 
    { 
     "name": "pass", 
     "value": "{\"test_type\":\"jsystem\",\"order\":3,\"test_id\":\"test_03\",\"physical_setup_id\":\"prd_01\",\"timeout\":\"15\"}", 
     "own": true 
    } 
] 
} 

И я пытаюсь извлечь все поля, которые содержат «имя тестового% ЧИСЛО%» Я пробовал: cat build.json | jq '.property | .[] | select(.name=="test1")' - он работает нормально, но я хочу добавить цифровой параметр в .name == test. Что-то вроде этого:

cat build.json | jq '.property | .[] | select(.name=="test'[0-9]'")' 

Ans второй мне нужно разобрать каждый данных в параметре «значение». Как это:

test1: 
test_type=jsystem 
order=1 
test_id=test_01 


] 
} 
+0

Что вы подразумеваете под «цифровым параметром»? и не могли бы вы опубликовать код, который используете? Спасибо –

+0

Привет! Я имел в виду, что «test1» «test2» «test3» может быть любым числом после слова «тест». Код, который я написал выше: cat build.json | jq '.property | . [] | select (.name == "test1") ' –

+0

Полный пример объекта JSON был бы полезен. Я даже не вижу «.property». – FatalError

ответ

0

С JQ 1,5, поддержка регулярных выражений была добавлена ​​

Так предполагая property является массив тестовых объектов (ваш пример сломан и недействительным), вы можете сделать это, чтобы выбрать объекты с именами, которые следуют схеме:

.property | map(select(.name | test("test[0-9]"))) 

Тогда для каждого из этих объектов, то value кажется, JSON строки. Вам придется разбирать их, прежде чем вы сможете получить что-нибудь из них.

.property | map(
    select(.name | test("test[0-9]")) 
     | .value |= fromjson 
     | { name } + .value 
    ) 

Это даст вам массив:

[ 
    { 
    "name": "test1", 
    "test_type": "jsystem", 
    "order": 1, 
    "test_id": "test_01", 
    "physical_setup_id": "prd_01", 
    "timeout": "20" 
    }, 
    { 
    "name": "test2", 
    "test_type": "jsystem", 
    "order": 2, 
    "test_id": "test_02", 
    "physical_setup_id": "prd_02", 
    "timeout": "30" 
    } 
] 

формат его по своему вкусу.

+0

Спасибо! Ты спас мой день! –

+0

Еще одна вещь ... Как я могу разделить результат на нечто подобное? –

Смежные вопросы