0

我正在尝试编写一个命令行界面,它将删除 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部分,但是逗号和 [] / {} 的存在让我很难。

这可以在命令行界面中执行吗?

4

3 回答 3

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=(',',': '))

到目前为止似乎有效,但如果有更好的方法,请发表评论:)

于 2015-01-29T02:37:43.250 回答
1

sed 对于多行匹配不是很好。

你会想用jq代替......它是“像 sed 用于 JSON 数据”。

于 2015-01-27T05:09:46.870 回答
1

这是一个使用del的解决方案。如果input.json包含

{
    "tags": {}, 
    "map": {
        "KPA": {
            "State": true, 
            "namespace": "KPA01"
        }
    }
}
{
    "tags": {
        "type": [
            "char"
        ], 
        "dynamic": true
    }, 
    "unitmap": {
        "KPA01": {
            "State": true, 
            "namespace": "KPA01"
        }
    }
}

调用 jq 作为

jq -M -c 'del(.map, .unitmap)' input.json

将产生输出

{"tags":{}}
{"tags":{"type":["char"],"dynamic":true}}
于 2017-08-24T19:19:59.423 回答