我有一个像这样的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-key
under的值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-key
其Name
值的数组元素。
表达方式
(.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)
的值进行更新。$newkey
jq
要就地进行更改,请使用类似
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
将修改后的输出直接发送到文件。
您需要将它们分组在括号中。