从目录中的所有文件中删除文本块

时间:2018-05-23 14:31:49

标签: json bash shell

我在.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"
    }
  }
}

2 个答案:

答案 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正则表达式,祝你好运。