Então eu copiei sua parte inferior em dois arquivos.
Arquivo 1:
{
"section1Configs": {
"level1Settings": {
"section01Lev01_01": true,
"section01Lev01_012": true,
"section01Lev01_02": true
}
}
}
E o arquivo 2 ...
{
"section1Configs": {
"level1Settings": {
"section01Lev01_01": true,
"section01Lev01_012": false,
"section01Lev01_02": true
}
}
}
Eles diferem apenas na linha Level01_012
.
Então eu fiz:
grep -Ev '[{}]|^$' file1 | grep -Fxvf- file2
{
"section1Configs": {
"level1Settings": {
"section01Lev01_012": false,
}
}
}
Esse comando é dividido da seguinte forma:
-
grep -Ev '[{}]|^$' file1
- Aqui, pedimos que
grep
imprima todas as linhas emfile1
que não correspondem a{
ou}
, mas deve corresponder a pelo menos um personagem. -
Sua saída é semelhante a:
"section01Lev01_01": true, "section01Lev01_012": true, "section01Lev01_02": true
- Aqui, pedimos que
-
grep -Fxvf- file2
- Isso é lido por este segundo
grep
que interpreta seu padrão de entrada-
stdin-f
ile como-F
ixed-string padrão-x
correspondência de linha inteira que deve -v
não imprime para saída. E assim, este segundogrep
imprime todas as linhas no arquivo2 que não correspondem exatamente às linhas verdadeiro / falso no arquivo1.
- Isso é lido por este segundo
Agora, se o seu grep
não entender -
como stdin, temos algumas opções:
grep -Ev '[{}]|^$' file1 | grep -Fxvf /dev/fd/0 file2
... funcionará na maioria dos sistemas. Uma opção semelhante é usar /dev/stdin
, que também é muito provável que funcione, se bem que um pouco menos.
Existe também uma implementação específica do shell, conhecida como substituição de processo , que funciona exatamente da mesma maneira ...
grep -Fxvf <(grep -Ev '[{}]|^$' file1) file2
... que pode ou não funcionar para você, dependendo do seu shell.
Outra possibilidade é ...
grep -Fxv "$(grep -Ev '[{}]|^$' file1)" file2
... que pode ou não funcionar para você, dependendo de quão grande é a saída do comando subbed grep
.
Experimente alguns e provavelmente encontrará um que funcione para você.