使用单个命令删除所有目标 json 字段



我想知道是否可以使用单行命令(例如使用 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(。

最新更新