기본 파일에 동일한 항목이 있으면 파일의 항목을 삭제합니다.

기본 파일에 동일한 항목이 있으면 파일의 항목을 삭제합니다.

계정별 구성 파일(또한 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,
        }
    }
}

명령은 다음과 같이 분류됩니다.

  1. grep -Ev '[{}]|^$' file1

    • grep여기서는 각 줄을 인쇄하도록 요청합니다.file1{문자나 문자와 일치하지 않지만 }최소한 일치해야 합니다.하나특징.
    • 출력은 다음과 같습니다.

              "section01Lev01_01": true,
              "section01Lev01_012": true,
              "section01Lev01_02": true
      
  2. grep -Fxvf- file2

    • grep이것은 표준 입력 패턴 파일을 전체 라인과 일치하는 고정 문자열 패턴으로 해석하는 이 초에 의해 읽혀집니다 .--f-F-xv 아니요인쇄물. 따라서 이 두 번째는 grepfile1의 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로
할 수 있습니다 .pastesed

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
  }
}

관련 정보