我想知道是否可以使用单行命令(例如使用 sed(删除与给定条件匹配的所有 JSON 字段。如果单行无法实现,我想要最简单/最小的方法。
示例:我决定不再需要"id"字段。
输入 JSON 文件:
{
"games": [
{"id": "1","name": "Mario", "game": "nintendo"},
{"id": "2","name": "Luigi", "game": "nintendo"},
{"id": "3","name": "Sonic", "game": "sega"}
]
}
预期产出:
{
"games": [
{"name": "Mario", "game": "nintendo"},
{"name": "Luigi", "game": "nintendo"},
{"name": "Sonic", "game": "sega"}
]
}
谢谢你的帮助。
您可以使用jq
,并且有很多选择,例如:
-
将所需属性列入白名单:
cat games.json | jq '[.games[] | {name, game}]'
在 JQ>Play 上查看此操作。
-
将不需要的属性列入黑名单:
cat games.json | jq '[.games[] | del(.id)]'
在 JQ>Play 上查看此操作。
-
遍历整个树以删除匹配属性:
cat games.json | jq 'del(..|.id?)'
在 JQ>Play 上查看此操作。
使用 foreach 方法并在循环内删除:
let obj = JSON.parse ( yourJson );
Object.keys(obj).forEach( (key) => {
delete obj[key];
});
yourJson = JSON.stringify( obj );
我能够弄清楚如何使用sed做到这一点。以下命令适用于上述示例:
sed 's/("id":).*("name)/2/' games.json
这是如何工作的:
sed 's/(FROM).*(UNTIL)/FROM_INCLUSIVE UNTIL_INCLUSIVE/' input_file
此命令将位于 FROM中的字符串和TILL中的字符串之间的所有内容替换为空字符串。然后我们可以指定是否应该保留这些字符串:\1 将字符串保留在FROM中,\2 将保留UNTIL,省略意味着排除。在上面的例子中,我们说我们要删除">id":and"name之间存在的所有内容,同时排除前者(没有\1(并包括后者(有一个\2(。