我在.json类型的目录中有100个文件。在这些文件中,我在所有文件中都有以下块
"bind_dev": [
"eth0",
"bond0"
],
我想从扩展名为.json的所有文件中删除此块。如何使用linux shell完成?
{
"name": "wnx_production",
"description": "Wellnext",
"cookbook_versions": {
"fms-base": "= 1.0.49",
"fms-zabbix": "= 0.1.35",
"linuxad_auth": "= 0.2.75",
"itcs104_bundle": "= 0.3.23",
"policy_all_deep_security": "= 0.1.17",
"fms-pdns": "= 0.1.38",
"fms-yum": "= 0.1.17",
"tscm": "= 1.0.29",
"sudo": "= 2.7.10"
},
"json_class": "Chef::Environment",
"chef_type": "environment",
"default_attributes": {
"satellite-client": {
"capsule": {
"capsule_name": "dal13ammcaps01.imzcloud.ibmammsap.local"
}
},
"kickstart_ip": "146.89.142.214",
"tscm": {
"kickstart_ip": "146.89.142.214",
"bind_dev": [
"eth0",
"bond0"
],
"server_ip": "169.55.192.110",
"proxy_ip": "169.55.28.46",
"installer_url": "http://146.89.142.214/post_data/pkg/tivoliscm/"
},
"sudo": {
"include_sudoers_d": false,
"suroot_alias": "SUROOT"
},
"itcs104_bundle": {
"gem_source": {
"ssl_verify": false,
"clear": true
}
},
"sshd_config": {
"permitrootlogin": "without-password"
},
"chef-client-12": {
"chef-client-location": "http://146.89.142.214/post_data/pkg/chef"
}
}
}
答案 0 :(得分:2)
jq是从shell操作JSON数据的最佳方法。以下是如何使用它来处理每个文件:
for file in *.json; do
jq 'del(.default_attributes.tscm.bind_dev)' "$file" > "$file.tmp" &&
mv "$file.tmp" "$file"
done
答案 1 :(得分:0)
首先,我不会使用sed。我个人用Perl写的,但那不是你问的。
其次,仔细测试一下,仔细测试我的意思是首先备份整个设置,然后运行几次,看看它正在做你想做的所有事情,只有你要。 (再次,使用Perl ......但是因为你问过......)
sed -r -n '/^\s*"bind_dev"\s*:.*/,/],/d' *.json
这太简单了。最好为正则表达式添加更多细节,但有时太多会让它错过任何东西,哪里不足以让它删除你不想丢失的东西。
c.f。:this guide扩展sed正则表达式,祝你好运。