Json

使用 jq 在鍵可變時更改 json 中鍵的值

  • June 12, 2020

我有不想修改的 json 文件。問題是,目標鍵在 json 文件中有所不同。例如這兩個json:

{
   "tasks": [{
       "type": "type1",
       "params": {
           "get": "something",
           "foo": {
               "bar1": ["TEMPLATE"]
           }
       }
   }]
}

{
   "tasks": [{
       "type": "type1",
       "params": {
           "get": "something",
           "foo": {
               "different1": ["TEMPLATE"]
           }
       }
   }]
}

我想以動態方式更改鍵bar1的值。different1密鑰的路徑在所有 json 中都是恆定的,因此使用 jq 它將是:

jq '.tasks[0].params.foo' my_json_file.json

我已經嘗試過使用以下程式碼:

new_value="something"
jq --arg new "$new_value" '.tasks[0].params.foo[] = $new' my_json_file.json

但是這樣 key 的值bar1"something"代替["something"]. 寫出來的結果是

{
   "tasks": [{
       "type": "type1",
       "params": {
           "get": "something",
           "foo": {
               "different1": "something"
           }
       }
   }]
}

而不是我想要的:

{
   "tasks": [{
       "type": "type1",
       "params": {
           "get": "something",
           "foo": {
               "different1": ["something"]
           }
       }
   }]
}

我很確定這對 jq 來說並不難,但我找不到解決方案。

關於什麼 … ?

jq --arg new "something" '.tasks[0].params.foo[] = [ $new] ' file 

您可以在不訪問密鑰with_entries(..)的情況下使用和直接操作values[]數組

jq --arg new "something" '.tasks[0].params.foo |= with_entries(.value[] = $new)'

引用自:https://unix.stackexchange.com/questions/592485