programing

jq in-place를 사용하여 json의 키 값 수정

golfzon 2023. 3. 25. 12:05
반응형

jq in-place를 사용하여 json의 키 값 수정

특정 값을 수정하는 json이 있지만 터미널에는 항상 변경된 값을 가진 json이 표시되지만 실제로 특정 파일의 값은 변경되지 않습니다.샘플 json:

{
   name: 'abcd',
   age: 30,
   address: 'abc'
}

파일 자체의 주소 값을 변경하고 싶은데, 아직 변경할 수 없습니다.다음을 사용해 보았습니다.

jq '.address = "abcde"' test.json

하지만 그것은 작동하지 않았다.좋은 의견이라도 있나?

임시 파일을 사용합니다.임플레이스 편집을 한다고 주장하는 모든 프로그램이 이 작업을 수행합니다.

tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json

있지 는, 올바른 를 「어드레스」를 해 주세요.jq★★★★

address=abcde
jq --arg a "$address" '.address = $a' test.json > "$tmp" && mv "$tmp" test.json

AFAIKjq편집을 하지 않으므로 후 을 원래 하거나 임플레이스 파일을 해야 합니다.sponge더 많이 이용하다

jq '.address = "abcde"' test.json|sponge test.json

「같은 파일로 리다이렉트」하는 다른 테크닉도 있습니다.예를 들어, 출력을 변수인 t.c에 보존하는 등, 이것에 대해 자세하게 알고 싶다면, 「Unix & Linux Stack Exchange」를 추천합니다.

임시 파일은 불필요할 때 복잡해집니다(JSON 파일이 너무 커서 메모리에 넣을 수 없는 경우가 아니면(RAM/병렬 용량에 따라 GB에서 100 GB까지)).

순수한 배쉬 방식.

contents="$(jq '.address = "abcde"' test.json)" && \
echo -E "${contents}" > test.json

장점

  • 저글링할 임시 파일이 없습니다.
  • 순수한 배시
  • 「」를 인스톨 하기 sponge 되어
  • 심플한

단점

  • 문자 그대로 null 문자를 포함할 수 없기 때문에 json에 대해 완벽하게 작동합니다.이것을 json area 밖에서 시도하면 null이 발생했을 때 실패합니다(또한 부호화/복호화 회피책도 필요합니다).Bash 변수는 리터럴 null을 저장할 수 없습니다.

주의: 리다이렉션은 표현의 좌측(LHS)이 실행되기 전에 시작되어 실행 전에 리다이렉션을 시작할 수 있기 때문에 (@codekandis 권장과 같이) "1개의 명령어"로 조합할 수 없습니다.jq파일을 잘못 비우므로 두 개의 개별 명령어가 있습니다.시도할 때 효과가 있는 것처럼 보일 수 있지만, 이는 오해를 불러일으키고 상황이 바뀌자마자 실패할 가능성이 매우 높습니다.

업데이트: 추가됨-E에 있는 경우에 대비하여 이스케이프 문자를 비활성화하기 위한 옵션systems where they are interpreted by default.(실제로 본 적이 없는 것)

셰프너에 답변을 추가하고 셸 스크립트로 원하는 경우.

test.json

{
  "name": "abcd",
  "age": 30,
  "address": "abc"
}

script.sh

#!/bin/bash
address="abcde"
age=40

# Strings:
jq --arg a "${address}" '.address = $a' test.json > "tmp" && mv "tmp" test.json

# Integers:
jq --argjson a "${age}" '.age = $a' test.json > "tmp" && mv "tmp" test.json

단일 및 다중 값이 변경되는 내포된 json 예제입니다.

config.json

{
  "Parameters": {
    "Environment": "Prod",
    "InstanceType": "t2.micro",
    "AMIID": "ami-02d8e11",
    "ConfigRegion": "eu-west-1"
  }
}

다음 명령을 사용하여 여러 값을 편집할 수 있습니다.

tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf" | .Parameters.Environment = "QA"' config.json > "$tmp" && mv "$tmp" config.json

다음 명령어를 사용하면 단일 값을 편집할 수 있습니다.

tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf"' config.json > "$tmp" && mv "$tmp" config.json

이것은 효과가 있을 것이다.

address = aaaaa
echo $(jq --arg a "$address" '.address = ($a)' test.json) > test.json

어떤 이유로든 에코가 없으면 bin 파일이 생성되고 python 스크립트는 해석할 수 없습니다.

나는 여기와 여기 두 가지 대답 중 가장 좋은 것을 얻었다.

여기에는 다음과 같은 파라미터가 사용됩니다.actionname할당에 대한 입력으로서name속성을 선택합니다.ACTION_NAME은 치환값으로 사용하는 envvar일 뿐입니다.

contents="$(jq --arg actionname ${ACTION_NAME} '.name = $actionname' ./${ACTION_NAME}/package.json)" && \
echo -E "${contents}" > ${ACTION_NAME}/package.json;

어떤 솔루션도 마음에 들지 않아 유틸리티를 만들었습니다.

pip install sde

그런 다음, 예를 들어 다음과 같은 JSON 데이터의 경우:

{
  "Parameters": {
    "Environment": "Prod",
    "InstanceType": "t2.micro",
    "AMIID": "ami-02d8e11",
    "ConfigRegion": "eu-west-1"
  }   
}

다음과 같이 할 수 있습니다.

sde Parameters.Environment Dev test.json

언급URL : https://stackoverflow.com/questions/42716734/modify-a-key-value-in-a-json-using-jq-in-place

반응형