我正在尝试编写一个命令行接口,它将删除json文件列表中的特定部分/代码行。顺便说一下,json文件位于主目录
的子文件夹中这是我可以提出的代码 - find -name "*.json" | xargs sed -i "map"
但是我有一些json文件,它的格式略有不同
到目前为止,我在列表中看到以下两种格式:
{
"tags": {},
"map": {
"KPA": {
"State": True,
"namespace": "KPA01"
}
}
}
或
{
"tags": {
"type": [
"char"
],
"dynamic": true
},
"unitmap": {
"KPA01": {
"State": True,
"namespace": "KPA01"
}
}
}
基本上,我正在尝试省略它所拥有的map
部分,以便它只显示tags
部分,但是逗号和[] / {}的存在正在制作它对我来说很难。
这可以在命令行界面中这样做吗?
答案 0 :(得分:1)
您希望使用jq代替......它,"就像sed for JSON data"。
答案 1 :(得分:1)
好吧,最后我仍然无法弄清楚使用jq
而是找到了一些来源,我使用了一个脚本来执行并执行删除
import sys
import json
inputfile = sys.argv[1]
with open(inputfile,'r') as myfile:
obj = json.loads(myfile.read().replace('True','true'))
if "unitmap" in obj:
del obj["unitmap"]
with open(inputfile,'w') as myfile:
json.dump(obj,myfile,indent=4,separators=(',',': '))
到目前为止似乎工作,但如果有更好的方法,请评论:)
答案 2 :(得分:1)
以下是使用 del 的解决方案。如果input.json
包含
{
"tags": {},
"map": {
"KPA": {
"State": true,
"namespace": "KPA01"
}
}
}
{
"tags": {
"type": [
"char"
],
"dynamic": true
},
"unitmap": {
"KPA01": {
"State": true,
"namespace": "KPA01"
}
}
}
调用jq as
jq -M -c 'del(.map, .unitmap)' input.json
将产生输出
{"tags":{}}
{"tags":{"type":["char"],"dynamic":true}}