계정별 구성 파일(또한 JSON 형식)에 의해 값이 재정의될 수 있는 JSON 기본 구성 파일이 있습니다. 기본 파일의 구조는 다음과 같습니다.
{
"section1Configs": {
"setting01": true,
"setting02": true,
"setting03": false
},
section2Configs: {
"setting01": true,
"setting02": true,
"setting03": false
},
section3Configs: {
"setting01": true,
"setting02": true,
"setting03": false
},
section4Configs: {
"setting01": true,
"setting02": true,
"setting03": false
}
}
특정 계정의 프로필은 다음과 같습니다.
{
"section1Configs": {
"setting01": true,
"setting02": true,
"setting03": true
},
section2Configs: {
"setting01": false,
"setting02": true,
"setting03": false
},
section3Configs: {
"setting01": true,
"setting02": false,
"setting03": false
},
section4Configs: {
"setting01": true,
"setting02": true,
"setting03": false
}
}
참고로 일부 값(section01Config.setting03, section02Config.setting01, section03Config.setting02)을 제외하면 동일합니다. 또한 전체 section4Configs 블록이 두 파일 모두에서 동일하다는 점에 유의하세요.
애플리케이션이 두 파일을 모두 로드하고 계정 구성과 다른 파일로 기본 파일을 덮어쓰므로 동일한 파일이 필요하지 않습니다.
내가 하고 싶은 것은 그러한 계정 파일의 디렉터리를 반복하고 기본 파일과 동일한 키와 값을 가진 각 파일의 항목을 제거하는 스크립트를 갖는 것입니다. 이 예에서는 다음과 같은 파일이 생성됩니다.
{
section1Configs: {
setting03: true
},
section2Configs: {
setting01: false
},
section3Configs: {
setting02: false
}
}
200개 이상의 계정 프로필이 있으며 이를 수동으로 수행하는 데는 평생이 걸릴 것입니다. 어떤 도움이라도 대단히 감사하겠습니다!
- - - 편집하다- - - -
질문을 단순하게 하려고 노력했지만, 세부 사항이 부족하여 답변에 영향이 있을 것 같습니다.
계정 및 구성 JSON 파일은 섹션과 해당 설정으로 구성됩니다. 이는 JSON이 위에서 언급한 것보다 한 수준 더 깊다는 것을 의미합니다.
{
"section1Configs": {
"level1Settings": {
"section01Lev01_01": true,
"section01Lev01_012": true,
"section01Lev01_02": true
}
}
}
감사해요!
답변1
그래서 하단 내용을 두 개의 파일로 복사했습니다.
파일 1:
{
"section1Configs": {
"level1Settings": {
"section01Lev01_01": true,
"section01Lev01_012": true,
"section01Lev01_02": true
}
}
}
파일 2도 있습니다..
{
"section1Configs": {
"level1Settings": {
"section01Lev01_01": true,
"section01Lev01_012": false,
"section01Lev01_02": true
}
}
}
그들 사이의 유일한 차이점은Level01_012
철사.
그런 다음 나는 다음을 수행했습니다.
grep -Ev '[{}]|^$' file1 | grep -Fxvf- file2
{
"section1Configs": {
"level1Settings": {
"section01Lev01_012": false,
}
}
}
명령은 다음과 같이 분류됩니다.
grep -Ev '[{}]|^$' file1
grep
여기서는 각 줄을 인쇄하도록 요청합니다.file1
{
문자나 문자와 일치하지 않지만}
최소한 일치해야 합니다.하나특징.출력은 다음과 같습니다.
"section01Lev01_01": true, "section01Lev01_012": true, "section01Lev01_02": true
grep -Fxvf- file2
grep
이것은 표준 입력 패턴 파일을 전체 라인과 일치하는 고정 문자열 패턴으로 해석하는 이 초에 의해 읽혀집니다 .-
-f
-F
-x
v
아니요인쇄물. 따라서 이 두 번째는grep
file1의 true/false 줄과 정확히 일치하지 않는 file2의 모든 줄을 인쇄합니다.
이제 stdin을 grep
이해하지 못한다면 -
몇 가지 옵션이 있습니다.
grep -Ev '[{}]|^$' file1 | grep -Fxvf /dev/fd/0 file2
...대부분의 시스템에서 작동합니다. 비슷한 옵션은 을 사용하는 것인데 /dev/stdin
, 약간 덜하더라도 작동할 가능성이 높습니다.
다음과 같은 쉘 특정 구현도 있습니다.프로세스 교체거의 똑같은 방식으로 작동합니다.
grep -Fxvf <(grep -Ev '[{}]|^$' file1) file2
...쉘에 따라 작동할 수도 있고 작동하지 않을 수도 있습니다.
또 다른 가능성은...
grep -Fxv "$(grep -Ev '[{}]|^$' file1)" file2
...명령 대체의 출력 크기에 따라 작동할 수도 있고 작동하지 않을 수도 있습니다 grep
.
몇 가지를 시도해 보면 자신에게 맞는 것을 찾을 수 있을 것입니다.
답변2
json 전용 도구를 사용하는 것이 더 나을 수도 있습니다.잭또는제이슨? 하지만 원한다면 and로
할 수 있습니다 .paste
sed
paste config master | sed '/[{}]/! {/\(.\+\)\t\1/d;};s/\t.*//'
또는awk
awk '{getline a < "master"} /[{}]/ || $0 != a' config
구성 파일의 각 줄에 대해 기본 파일의 해당(번호별) 줄을 변수로 가져와 해당 줄이 a
기본 파일의 줄과 같 {
거나 다른 경우 }
인쇄합니다 .
결과:
{
"section1Configs": {
"setting03": true
},
section2Configs: {
"setting01": false,
},
section3Configs: {
"setting02": false,
},
section4Configs: {
}
}
답변3
이 페이지의 다른 부분에서 언급했듯이 이 문제를 해결하는 강력하고 효율적인 방법은 다음과 같은 JSON 인식 도구를 사용하는 것입니다.잭. 원래 문제에 대한 해결책이 아래에 제공됩니다. 변형을 해결하기 위해 쉽게 적용할 수 있습니다.
(1) 다음 내용을 minusConfig.jq와 같은 파일에 넣으세요.
def minus(o1;o2):
o1 | with_entries( select(o2[.key] != .value) );
def minusConfig(o1;o2):
reduce (o1|keys)[] as $key ({};
minus( o1[$key] ; o2[$key]) as $v
| if $v == {} then . else . + {($key): $v} end );
minusConfig($user; $master)
(2) 마스터 및 사용자 구성 파일이 각각 master.json 및 user.json이라고 가정하고,
$ jq -n --arg master master.json --arg user user.json -f minusConfig.jq
생산하다:
{
"section1Configs": {
"setting03": true
},
"section2Configs": {
"setting01": false
},
"section3Configs": {
"setting02": false
}
}