다음 작업에 도움이 필요합니다.
JSON 파일에는 다음과 유사한 섹션이 있습니다.
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
"AWS": [ 문자열을 찾아야 하며 "arn:aws:iam::33333333333:root"라는 새 줄을 추가해야 업데이트된 json 콘텐츠가 아래와 같아야 합니다.
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
Principal
당신이 JSON 문서의 최상위 개체이고, 쉘 변수에 저장된 일부 문자열을 entry
그 아래(처음에) 배열에 추가하려고 한다고 가정해 보겠습니다 AWS
.
entry='arn:aws:iam::33333333333:root'
jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
이 표현식은 jq
명령줄에서 할당을 사용하여 변수에 포함된 문자열을 배열의 시작 부분에 추가합니다(추가된 요소부터 시작하여 원래 배열의 요소가 뒤따르는 새 배열로 배열을 업데이트/다시 작성합니다).jq
$e
--arg
AWS
|=
$e
요소 추가끝배열 수정은 약간 더 쉬울 것이며 아마도 더 효율적일 것입니다(전체 배열을 다시 작성할 필요가 없기 때문에).
jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
시험:
$ cat file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
"arn:aws:iam::33333333333:root"
]
}
}
답변2
sed
여기 도구가 잘못되었습니다.JSON은 일반 언어가 아닙니다따라서 정규식을 적용할 수 있는 도구는 유효한 JSON을 모두 구문 분석할 수 없습니다.
따라서 JSON을 구문 분석하고 수정하기 위해 특별히 설계된 도구를 사용하는 것이 jq
좋습니다. 하지만 일반적으로 가끔 사용자의 경우 문자 그대로 7줄의 Python을 작성하는 것이 더 깔끔합니다.
#!/usr/bin/env python3
# You'll want to save this to a file, e.g. mypythonscript,
# and make it executable: chmod 755 mypythonscript
import json, sys
data_in = None
with open(sys.argv[1]) as infile:
data_in = json.load(infile)
data_in["AWS"] = ["arn:aws:iam::33333333333:root"] + data_in["AWS"]
with open(sys.argv[1], "w") as outfile:
json.dump(data_in, outfile)
당신을 정당하게 만들 것입니다
./mypythonscript data.json