如何使用 jq 替换 json 文件中的值并返回整个内容

如何使用 jq 替换 json 文件中的值并返回整个内容

我有一个像这样的json

{
  "AgentGroupId": null,
  "AgentId": null,
  "CreateType": "Website",
  "IsPrimary": true,
  "IsShared": true,
  "HeaderAuthentication": {
    "Headers": [
      {
        "Name": "api-key",
        "Value": "TEST_API_KEY_VALUE-2",
        "OriginalName": null,
        "IsReplacedCredentials": false
      },
      {
        "Name": "Authorization",
        "Value": "",
        "OriginalName": null,
        "IsReplacedCredentials": false
      }
    ],
    "IsEnabled": true
  },
  "IsTimeWindowEnabled": false,
  "AdditionalWebsites": [],
  "BasicAuthenticationApiModel": {
    "Credentials": null,
    "IsEnabled": false,
    "NoChallenge": false
  },
  "ClientCertificateAuthenticationSetting": null,
  "Cookies": null,
  "CrawlAndAttack": true,
  "EnableHeuristicChecksInCustomUrlRewrite": true,
  "ExcludedLinks": [
    {
      "RegexPattern": "gtm\\.js"
    },
    {
      "RegexPattern": "WebResource\\.axd"
    },
    {
      "RegexPattern": "ScriptResource\\.axd"
    }
  ],
  "ExcludedUsageTrackers": [],
  "DisallowedHttpMethods": [],
  "ExcludeLinks": true,
  "ExcludeAuthenticationPages": false,
  "FindAndFollowNewLinks": true,
  "FormAuthenticationSettingModel": {
    "Integrations": {},
    "CustomScripts": [],
    "InteractiveLoginRequired": false,
    "DefaultPersonaValidation": null,
    "DetectBearerToken": true,
    "DisableLogoutDetection": false,
    "IsEnabled": false,
    "LoginFormUrl": null,
    "LoginRequiredUrl": null,
    "LogoutKeywordPatterns": null,
    "LogoutKeywordPatternsValue": null,
    "LogoutRedirectPattern": null,
    "OverrideTargetUrl": false,
    "Personas": [],
    "PersonasValidation": null
  }
}

我的目标是替换api-keyunder的值HeaderAuthentication(可以是索引 0 或 1 或 2 或任何)

我做了这个

jq '.HeaderAuthentication.Headers[] | select(.Name == "api-key") | .Value = "xxx"' scanprofile.json > tmp && mv tmp scanprofile.json

问题是似乎jq只返回替换的部分,但我需要整个文件,我做错了什么?

这是运行命令后文件的内容

{
  "Name": "api-key",
  "Value": "xxx",
  "OriginalName": null,
  "IsReplacedCredentials": false
}

附注我看到一些 stackoverflow 帖子使用海绵,我不能在我们的环境中使用海绵

答案1

表达jq方式

.HeaderAuthentication.Headers[] | select(.Name == "api-key")

挑选出Headers具有api-keyName值的数组元素。

表达方式

(.HeaderAuthentication.Headers[] | select(.Name == "api-key")).Value |= "NEW VALUE"

将该数组元素中的键值更新Value为文字字符串NEW VALUE

从命令行使用保存新值的 shell 变量:

new_api_key='My new key'
jq --arg newkey "$new_api_key" '(.HeaderAuthentication.Headers[] | select(.Name == "api-key")).Value |= $newkey' file.json

如果密钥需要进行 Base64 编码,请使用表达式中($newkey|@base64)的值进行更新。$newkeyjq

要就地进行更改,请使用类似

tmpfile=$(mktemp)
cp file.json "$tmpfile" &&
jq --arg ...as above... "$tmpfile" >file.json &&
rm -f -- "$tmpfile"

或者,如果您不需要保留原始文件的权限和所有权等,

tmpfile=$(mktemp)
jq --arg ...as above... file.json >"$tmpfile" &&
mv -- "$tmpfile" file.json

答案2

以下应该有效:

tmp=$(mktemp /tmp/tmp.XXXXXXX)
jq  '(.HeaderAuthentication.Headers[] | select(.Name == "api-key") | .Value) = "xxx"' scanprofile.json  > "$tmp" && mv "$tmp"  scanprofile.json

另一种方法是使用这个:

cat <<< $(jq '(.HeaderAuthentication.Headers[] | select(.Name == "api-key") | .Value) = "xxx"' scanprofile.json ) > scanprofile.json

这里我们使用cat将修改后的输出直接发送到文件。

您需要将它们分组在括号中。

相关内容