我有一个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": ""
}
}
}
}
答案 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 ...
注意:适用于多行文件(与您的一样)。