簡體   English   中英

如何使用jq在JSON文件中添加嵌套鍵/值

[英]How to add a nested key/value in a JSON file using jq

我是jq命令的新手,停留在編輯JSON文件的地方。 我有以下格式的JSON文件。

{
  "service": {
    "name": "web",
    "tags": [
      "contact_points"
    ],
    "check": {
      "script": "tmp/status_check.py > /dev/null 2>&1",
      "interval": "10s"
    }
  }
}

我想修改此JSON以添加嵌套鍵/值,如下所示:

{
"service": [{
        "name": "web",
        "tags": [
            "contact_points"
        ],
        "check": {
            "script": "tmp/status_check.py > /dev/null 2>&1",
            "interval": "10s"
        }
    },
    {
        "name": "tomcat",
        "tags": [
            "contact_points"
        ],
        "check": {
            "script": "tmp/status_check.py > /dev/null 2>&1",
            "interval": "10s"
        }
    }
]

}

我嘗試了以下命令,但它覆蓋了文件的內容。

jq'。 + {“ service”:“ {” name“:” tomcat“,” tags“:[” contact_points“],” check“:{” script“:” tmp / status_check.py> / dev / null 2>&1“ ,“ interval”:“ 10s”}}“}'/tmp/status.json> / tmp / file && mv / tmp / file /tmp/status.json

並給出以下輸出

{
  "service": {
    "name": "tomcat",
    "tags": [
      "contact_points"
    ],
    "check": {
      "script": "tmp/status_check.py > /dev/null 2>&1",
      "interval": "10s"
    }
  }
}

我嘗試轉義特殊字符,但無法獲得所需的輸出。 還有其他方法可以實現這一目標嗎? 任何幫助是極大的贊賞。

感謝您更新問題。 由於在您的輸入.service是一個對象,而在您的輸出.service是一個數組,因此以下是使用輔助函數的解決方案:

def as_array:if type=="object" then [.] else . end;

.service |= as_array + [
   {
     "name": "tomcat",
     "tags": [
       "contact_points"
     ],
     "check": {
        "script": "tmp/status_check.py > /dev/null 2>&1",
        "interval": "10s"
     }
   }
]

如果上面的過濾器在filter.jq而您的示例數據在status.json ,則命令

$ jq -M -f filter.jq status.json

產生

{
  "service": [
    {
      "name": "web",
      "tags": [
        "contact_points"
      ],
      "check": {
        "script": "tmp/status_check.py > /dev/null 2>&1",
        "interval": "10s"
      }
    },
    {
      "name": "tomcat",
      "tags": [
        "contact_points"
      ],
      "check": {
        "script": "tmp/status_check.py > /dev/null 2>&1",
        "interval": "10s"
      }
    }
  ]
}

如果要用此輸出替換現有的status.json,則可以使用moreutils這樣的解決方案,例如海綿(1)

$ jq -M -f filter.jq status.json | sponge status.json

如果您的目標只是采用單一服務並以新名稱復制它,則可以執行以下操作:

.service |= [., .name = "tomcat"]

https://jqplay.org/s/33L3zA9Fos

也就是說,通過創建一個包含當前項的數組和另一個副本,其中name屬性為"tomcat" ,來更新服務屬性( .service |= ... )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM