JSON 파일의 각 키 앞에 문자열을 추가합니다.

JSON 파일의 각 키 앞에 문자열을 추가합니다.

Bash 스크립트로 읽는 JSON 파일이 있고 각 키 앞에 고정 문자열을 추가하고 싶습니다.

json_파일:

{"key_1": 12, "key_2": 34, "key_3": 56}

각 키에 문자열을 추가하여 x_이 데이터를 업데이트하는 가장 깔끔한 방법은 무엇입니까 ?

예를 들어,

{"x_key_1": 12, "x_key_2": 34, "x_key_3": 56}

답변1

JSON 파서를 사용하여 jqJSON 파일을 구문 분석할 수 있습니다. 이는 형태에 관계없이 유효한 JSON을 처리할 수 있다는 장점이 있습니다.

jq 'with_entries(.key |= "x_" + .)' <file.json

입력하다

{"key_1": 12, "key_2": 34, "key_3": 56}

산출

{
  "x_key_1": 12,
  "x_key_2": 34,
  "x_key_3": 56
}

다음을 사용하여 JSON을 한 줄로 유지할 수 있습니다 jq -c ….

{"x_key_1":12,"x_key_2":34,"x_key_3":56}

솔루션은 문서에 예시로 표시되어 있습니다 jq. 살펴보고 man jq검색해 보세요 with_entries. 그러나 참조 문서이기 때문에 어떻게 설명해야 할지 모르는 내용을 찾기가 어렵습니다.

답변2

제목의 질문을 문자 그대로 받아들이면 다음은 입력 문서의 모든 키에 일부 사용자 제공 문자열을 반복적으로 추가합니다.

jq --arg prefix x_ '
    walk(
        if type == "object" then 
            with_entries(.key = $prefix + .key)
        else . end
    )' file

키 업데이트는 다음과 유사합니다.엠마 루오의 답변이지만 업데이트 연산자를 사용하지 않습니다. 접두사 문자열은 하드코딩된 문자열 대신 명령줄에도 제공됩니다.

테스트 실행:

$ cat file
{
  "key_1": 12,
  "key_2": 34,
  "key_3": [
    {
      "key_1": "{\"key_A\":123}",
      "key_2": 34,
      "key_3": 56
    },
    {
      "key_1": "{\"key_A\":123}",
      "key_2": 34,
      "key_3": 56
    }
  ]
}
$ jq --arg prefix x_ 'walk(if type == "object" then with_entries(.key = $prefix + .key) else . end)' file
{
  "x_key_1": 12,
  "x_key_2": 34,
  "x_key_3": [
    {
      "x_key_1": "{\"key_A\":123}",
      "x_key_2": 34,
      "x_key_3": 56
    },
    {
      "x_key_1": "{\"key_A\":123}",
      "x_key_2": 34,
      "x_key_3": 56
    }
  ]
}

답변3

json 형식이 한 줄이면 다음이 작동합니다.

sed -i 's/"\([^"]*\)":/"x_\1":/g' json_file.json

JSON 형식이 다음과 같은 경우:

{
   "key_1": 1, 
   "key_2": "v2", 
   "key_3": 3
}

위 명령을 사용할 수 있지만 sed다음과 같은 더 간단한 명령을 사용할 수도 있습니다 sed.

sed -i 's/"\(.*\)":/"x_\1":/'  json_file.json

노트:위의 솔루션은 다음 패턴이 없는 숫자나 문자열만 있는 경우에 잘 작동합니다.

{ "key_1": "\"Sale\": foobar" }
// Or
{ "\"key_1\"": "\"Sale\": foobar" } // I think  this case is less common

따라서 키를 올바르게 편집하는 가장 좋은 방법은 다음을 사용하는 것입니다.엠마 루오의 답변. 다른 가능한 해결책을 시도했습니다 sed(그러나 실패할 수 있는 다른 상황이 있는지는 확실하지 않습니다). json 파일이 다음과 같은 경우:

{"key_1": "\"Sale\": foobar", "key_2": "\"3\":", "key_3": 56}
// Or maybe
{"key_1": "\"Sale:sale\": foobar", "key_2": "\"3\":", "key_3": 56}

다음을 사용해 볼 수 있습니다.

sed -i 's/"\([^"\][^"\]*\)":/"x_\1":/g' json_file.json

그러나 json 파일이 다음과 같은 경우 위 명령은 실패합니다.

{"\"key_1\"": "\"Sale:\": foobar", "key_2": "\"3\":", "key_3": 56}
// If the json keys  have \"somekey\" as their keys then the sed command will fail. 
// So using sed for this task might be a little tricky for avoiding these problems.

관련 정보