나는 이런 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
}
추신: 스폰지를 사용하는 스택오버플로우 게시물을 보았는데, 우리 환경에서는 스폰지를 사용할 수 없습니다.
답변1
표현 jq
방식
.HeaderAuthentication.Headers[] | select(.Name == "api-key")
값 이 Headers
있는 배열 요소를 선택합니다 .api-key
Name
표현 방식
(.HeaderAuthentication.Headers[] | select(.Name == "api-key")).Value |= "NEW VALUE"
이 배열 요소의 키 값을 Value
리터럴 string 으로 업데이트합니다 NEW VALUE
.
명령줄에서 새 값을 보유하는 쉘 변수를 사용하십시오.
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
여기서는 수정된 출력을 파일로 직접 보내는 데 사용합니다 .
괄호 안에 그룹화해야 합니다.