【问题标题】:issue in replacing multiple values using jq in json file在 json 文件中使用 jq 替换多个值的问题
【发布时间】:2021-06-26 13:22:42
【问题描述】:

我正在尝试使用以下代码将“fromRef”和“toRef”中的 slug 条目从 dummyrepo1 替换为 dummyrepo2

#!/bin/bash
function template {
   cat << EOF 
{
  "title": "test comment"
  "description: "testing"
  "fromRef": {
     "id": "refs/heads/testbranch"
      "repository" : {
        "slug": "dummyrepo1"
        "project": {
             "key": "TEST"
          }
         }
      },
   "toRef":{
      "id": "refs/heads/master"
       "repository" : {
       "slug" : "dummyrepo1"
       "project": {
            "key": "TEST"
         }
       }
     }
}
EOF
}

function modify_json() {
   template | 
        jq --arg update_slug "${1}" \
        '.fromRef.repository
        |= (.slug |= $update_slug) |
         .toRef.repository
        |= (.slug |= $update_slug)
        '
}

updated_JSON=$modify_json dummyrepo2)
echo "$updated_JSON"

我期待输出为

{
      "title": "test comment"
      "description: "testing"
      "fromRef": {
         "id": "refs/heads/testbranch"
          "repository" : {
            "slug": "dummyrepo2"
            "project": {
                 "key": "TEST"
              }
             }
          },
       "toRef":{
          "id": "refs/heads/master"
           "repository" : {
           "slug" : "dummyrepo2"
           "project": {
                "key": "TEST"
             }
           }
         }
    }

但是得到这样的输出,我可以知道我在哪里做错了

{
          "title": "test comment"
          "description: "testing"
          "fromRef": {
             "id": "refs/heads/testbranch"
              "repository" : {
                "slug": "dummyrepo2"
                "project": {
                     "key": "TEST"
                  }
                 }
              },
           "toRef":{
              "id": "refs/heads/master"
               "repository" : {
               "slug" : "dummyrepo1"
               "project": {
                    "key": "TEST"
                 }
               }
             },
            "toRef":{
               "repository" : {
               "slug" : "dummyrepo2"
               }
            }
         }

意思是,脚本不是替换 toRef 中的“dummyrepo2”,而是修改输出中的新条目

【问题讨论】:

  • 这些都不是有效的 json
  • 但是我可以使用 > 中的内容通过 API 提高 bitbucket 中的 PR。但我正在尝试为多个回购自动化它,同时这样做面临这样的问题
  • jq 基本上是用于生成 JSON,您想要的输出不是 JSON。你甚至没有说它是什么格式。

标签: json jq


【解决方案1】:

在使您的输入 json 有效后,我可以更正您在 fromReftoRef 中对 slug 的更新语句:

#!/bin/bash

JSON='
{
  "title": "test comment",
  "description": "testing",
  "fromRef": {
    "id": "refs/heads/testbranch",
    "repository": {
      "slug": "dummyrepo1",
      "project": {
        "key": "TEST"
      }
    }
  },
  "toRef": {
    "id": "refs/heads/master",
    "repository": {
      "slug": "dummyrepo1",
      "project": {
        "key": "TEST"
      }
    }
  }
}
'

jq --arg update_slug 'dummyrepo2' '
  .fromRef.repository.slug |= $update_slug
  | .toRef.repository.slug |= $update_slug
' <<< "$JSON"

输出

{
  "title": "test comment",
  "description": "testing",
  "fromRef": {
    "id": "refs/heads/testbranch",
    "repository": {
      "slug": "dummyrepo2",
      "project": {
        "key": "TEST"
      }
    }
  },
  "toRef": {
    "id": "refs/heads/master",
    "repository": {
      "slug": "dummyrepo2",
      "project": {
        "key": "TEST"
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多