jq를 사용하여 json의 키 값을 변경하면 키가 변경 가능합니다.

jq를 사용하여 json의 키 값을 변경하면 키가 변경 가능합니다.

수정하고 싶지 않은 json 파일이 있습니다. 문제는 json 파일의 대상 키가 다르다는 것입니다. 예를 들어 다음 두 json은 다음과 같습니다.

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "bar1": ["TEMPLATE"]
            }
        }
    }]
}

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": ["TEMPLATE"]
            }
        }
    }]
}

키 값을 동적으로 변경하고 싶습니다 bar1. different1키 경로는 모든 json에서 일정하므로 jq를 사용하면 다음과 같습니다.

jq '.tasks[0].params.foo' my_json_file.json

다음 코드를 시도했습니다.

new_value="something"
jq --arg new "$new_value" '.tasks[0].params.foo[] = $new' my_json_file.json

그러나 이 방법으로 key 값이 대체됩니다 bar1. 기록된 결과는 다음과 같습니다."something"["something"]

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": "something"
            }
        }
    }]
}

내가 원하는 것 대신:

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": ["something"]
            }
        }
    }]
}

jq에서는 이것이 어렵지 않다고 확신하지만 해결책을 찾을 수 없습니다.

답변1

무엇에 대해서...?

jq --arg new "something" '.tasks[0].params.foo[] = [ $new] ' file 

답변2

키에 접근하지 않고도 with_entries(..)배열을 사용하고 직접 조작할 수 있습니다.values[]

jq --arg new "something" '.tasks[0].params.foo |= with_entries(.value[] = $new)'

관련 정보