打印 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 不是完成此任务的正确工具,我应该改用 awk 或 jq,但是我对后者没有任何经验。
因此,在 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
我有一个很长的 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 不是完成此任务的正确工具,我应该改用 awk 或 jq,但是我对后者没有任何经验。
因此,在 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