如何通过BASH中的sed命令从Json文件中删除Json对象

时间:2016-06-25 12:36:00

标签: json bash awk sed

我有一个json文件需要删除json对象。 有什么办法可以通过sed命令删除它。 我的示例文件如下所示。

{
        "name": "ABC",
        "description": "XYZ",
        "versions": {

        },
        "json_class": "Chef::Environment",
        "chef_type": "environment",
        "default_attributes": {

        },
        "override_attributes": {
          "company": {
            "xyz": {
                    "mailer":{
        "smtp_host": "Some IP",
        "imap_host": "Some Host",
    "imap_user": "Some UserId",
    "reply_to": "Some User Id",
    "outbound_user": "",
    "imap_mail_domain": "compute.oraclecloud.com",
    "imap_password": ""},

                    "logicaldomainname": ""
                      }
                      }
        }
    }

在此文件中,我想通过sed命令从文件中删除邮件程序对象。 请看一下,如果可以通过sed命令让我知道。

我删除的主要动机是用new替换这个对象 邮件对象。 以便下次发布另一个邮件程序对象时,我们会将其附加到xyz json对象中。

预期产出:

{
        "name": "ABC",
        "description": "",
        "version": {

        },
        "json_class": "Chef::Environment",
        "chef_type": "environment",
        "default_attributes": {

        },
        "override_attributes": {
          "Company": {
            "XYZ": {
                    "logicaldomainname": ""
                      }
                      }
        }
    }

3 个答案:

答案 0 :(得分:3)

您应该强烈考虑解决禁止jq的许可问题:

jq 'del(.override_attributes.company.xyz.mailer) | .description=""' input.json

答案 1 :(得分:2)

$ awk -v RS='^$' -v ORS= '{sub(/"mailer":[^}]+},[[:space:]]+/,"")}1' file
{
        "name": "ABC",
        "description": "",
        "versions": {

        },
        "json_class": "Chef::Environment",
        "chef_type": "environment",
        "default_attributes": {

        },
        "override_attributes": {
          "Company": {
            "XYZ": {
                    "logicaldomainname": ""
                      }
                      }
        }
    }

上面使用GNU awk进行多字符RS,与其他awks一起建立一行记录并在END部分处理它:

$ awk -v ORS= '{rec=rec $0 RS} END{sub(/"mailer":[^}]+},[[:space:]]+/,"",rec); print rec}' file
{
        "name": "ABC",
        "description": "",
        "versions": {

        },
        "json_class": "Chef::Environment",
        "chef_type": "environment",
        "default_attributes": {

        },
        "override_attributes": {
          "Company": {
            "XYZ": {
                    "logicaldomainname": ""
                      }
                      }
        }
    }

答案 2 :(得分:1)

使用sed

sed '/\"mailer\"/,/}/ d; /^$/d' 1.a

“从mailer删除到第一个},然后删除所有空行(您输入的有一行)”。

覆盖文件(“就地”)

sed -i ...

注意:适用于多行文件(与您的一样)。