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-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-keyName

표현 방식

(.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)표현식의 값으로 업데이트하세요.$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여기서는 수정된 출력을 파일로 직접 보내는 데 사용합니다 .

괄호 안에 그룹화해야 합니다.

관련 정보