【问题标题】:Removing lines from list of files in terminal从终端中的文件列表中删除行
【发布时间】:2015-01-27 04:37:53
【问题描述】:

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

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

【问题讨论】:

  • 不要使用sed 处理JSON。使用能够理解 JSON 的工具,例如 stedolan.github.io/jq 或像 Ruby 或 Python 这样的具有模块的语言。

标签: sed grep command-line-interface jq


【解决方案1】:

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

你会想要使用jq 来代替......它“就像 sed 用于 JSON 数据”。

【讨论】:

  • jq 对我来说确实是一个非常新的应用程序......它也是一个命令行的东西吗?
  • 确实是......就像 sed 但用于 json
  • 只是想知道,对于我试图实现的案例场景,jq 是否有可能,看到我的帖子中有上述不同格式的文件?
  • 我不确定这是否有意义,但我终于找到了删除对象的方法map - jq 'del(.map)' 但如果我正在运行这个命令 - cat | find -name "*.json" | xargs jq 'del(.unitmap)'虽然我的终端似乎显示了正确的结果,但它没有将结果附加到文件中。我做错了什么吗?
  • cat 不会更改文件...它只是将它们流式传输到标准输出(通常是终端)
【解决方案2】:

好吧,最后我还是无法弄清楚如何使用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=(',',': '))

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

【讨论】:

  • 顺便说一句,这有点不对劲,如果有必要我可以打开另一个问题。目前我正在根目录find -name "*.json" -exec <script path> '{}' ';' 中处理我的这个脚本,但我想知道是否可以执行相同的操作,但它只会针对几个子目录?
【解决方案3】:

这是一个使用 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}}

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多