使用jq解析JSON文件

时间:2015-07-28 13:30:17

标签: json bash jq

我有一个带有这种详细信息的JSON文件(不是完整文件):

{"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
    }
 ]
}

我正在尝试提取包含“name test%NUMBER%”的所有字段 我试过这个: cat build.json | jq '.property | .[] | select(.name=="test1")' - 它运行正常,但我想将数字参数添加到.name == test。 像这样:

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

Ans第二我需要在“value”参数下解析每个数据。 像这样:

test1:
test_type=jsystem
order=1
test_id=test_01


]
}

1 个答案:

答案 0 :(得分: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"
  }
]

根据自己的喜好对其进行格式化。