Json jq:如何有条件地更改数组值

Json jq:如何有条件地更改数组值,json,edit,jq,Json,Edit,Jq,一个全新的json和jq。我在网上搜索,但找不到解决问题的方法。 我有一个json文件,每个对象都包含数组。我需要有条件地更改一些数组元素:如果contact_type=email和类似“yahoo.com”的值将“yahoo.com”替换为“hotmail.com”。 我的档案: 生成的文件必须如下所示: [ { "name": "fluffy", "type": "cat", "contact_info": [

一个全新的json和jq。我在网上搜索,但找不到解决问题的方法。 我有一个json文件,每个对象都包含数组。我需要有条件地更改一些数组元素:如果contact_type=email和类似“yahoo.com”的值将“yahoo.com”替换为“hotmail.com”。 我的档案:

生成的文件必须如下所示:

[
    {
         "name": "fluffy",
         "type": "cat",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "123-456-6789"
             },
             {
                  "contact_type": "email",
                  "value": "fluffy_mean_cat@gmail.com"
             }
         ]
    },
    {
         "name": "breeze",
         "type": "dog",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "125-856-6789"
             },
             {
                  "contact_type": "email",
                  "value": "breeze@hotmail.com"
             }
         ]
    }
]

请提供帮助。

以下是许多可能的解决方案之一:

walk( if type == "object"
        and .contact_type == "email"
        and (.value | index("yahoo.com"))
      then .value |= sub("yahoo.com"; "hotmail.com")
      else . end )
直接法
else.

jq 1.6发布后,进行了一项更改,允许删除
else.

或者,您可以查看以解决此问题。jq 1.5中是否有其他解决方案?因为jq 1.5.Yes中没有
walk(f)
功能,但是您可以复制并粘贴
walk
的def。简单谷歌:jqdef步行
walk( if type == "object"
        and .contact_type == "email"
        and (.value | index("yahoo.com"))
      then .value |= sub("yahoo.com"; "hotmail.com")
      else . end )
def update:
  if .contact_type == "email"
     and (.value | index("yahoo.com"))
  then .value |= sub("yahoo.com"; "hotmail.com")
  else . 
  end ;

map( if .contact_info 
     then .contact_info |= map(update)
     else .
     end )