打印 JSON 个键值不同的属性

Print JSON attributes whose key and value are different

我有一个很长的 JSON 文件,其结构如下(没有嵌套属性):

{
    "Aaa aaa aaa": "Aaa aaa aaa",
    "Bbb bbb bbb": "Bbb bbb bbb",
    "Ccc ccc ccc": "Xxx xxx xxx",
    "Ddd ddd ddd": "Ddd ddd ddd",
    "Eee eee eee": "Yyy yyy yyy"
}

并且我需要打印那些键与值不匹配的对。在这个例子中,我期待这样的结果:

    "Ccc ccc ccc": "Xxx xxx xxx",
    "Eee eee eee": "Yyy yyy yyy"

我知道如何使用 sed 捕获和打印键和值...

sed -n "s/^\t\"\(.*\)\": \"\(.*\)\",\?$/ /p" file.json

...但我不知道如何在两组之间进行比较。也许 sed 不是完成此任务的正确工具,我应该改用 awkjq,但是我对后者没有任何经验。

因此,在 JSON 文件中搜索名称-值对差异的正确方法或工具是什么?

jq中您可以使用with_entries()函数。它将对象中每个记录的键和值放入命名变量 .key.value 中,你基本上必须评估它们是否 相同。

jq 'with_entries(select(.key != .value))'

请参阅手册 with_entries(..) 以了解更多信息


后续问题做不区分大小写的比较。可以通过将 key/value 转换为特定的 case

来完成
with_entries(select( (.key| ascii_downcase) != (.value| ascii_downcase)))
sed '/\(\".*\"\): /d' file.json

或者如果你也想去掉大括号:

sed '/\"/!d;/\(\".*\"\): /d' file.json