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 파서를 사용하여 jq
JSON 파일을 구문 분석할 수 있습니다. 이는 형태에 관계없이 유효한 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.