从终端中的文件列表中删除行

时间:2015-01-27 04:37:53

标签: sed grep command-line-interface jq

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

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

3 个答案:

答案 0 :(得分:1)

对于多线比赛来说,sed并不是很好。

您希望使用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}}