如何用Linux Shell移除目录下所有JSON文件中的指定代码块?
问题
我在某目录下有100个.json格式文件,所有文件均包含如下代码块:
"bind_dev": [ "eth0", "bond0" ],
我希望移除所有.json文件中的该代码块,请问如何通过Linux Shell实现?
附示例JSON文件内容:
{ "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" } } }
解决方案
这里有两种实用的Shell方法帮你批量处理,根据你的场景选就行:
方法一:用sed快速删除匹配行
如果所有文件里目标代码块的格式完全一致(空格、标点和示例完全相同),sed是最快捷的选择。
- 先切换到存放JSON文件的目录:
cd /path/to/your/json/files
- 执行批量删除命令(直接修改原文件,记得先备份文件!):
sed -i '/"bind_dev": \[ "eth0", "bond0" \ ],/d' *.json
- 说明:
-i参数让sed直接修改原文件;/pattern/d表示删除匹配到指定模式的行。 - 如果你用的是macOS(BSD版本的sed),需要把
-i改成-i '',否则会报错。
要是怕误操作,可以先不加-i预览修改效果:
sed '/"bind_dev": \[ "eth0", "bond0" \ ],/d' sample.json
方法二:用jq精准处理JSON(更安全)
如果你的JSON格式可能有变化(比如部分文件里bind_dev行有不同的空格、换行),用jq这种专门的JSON工具更靠谱,不会破坏JSON的结构。
- 先安装
jq(如果系统里没有的话):
# Debian/Ubuntu系列 sudo apt install jq # RHEL/CentOS系列 sudo yum install jq
- 批量处理命令:
for file in *.json; do jq 'del(.default_attributes.tscm.bind_dev)' "$file" > temp.json && mv temp.json "$file" done
- 说明:
del(.default_attributes.tscm.bind_dev)精准定位到示例JSON里bind_dev字段的路径并删除它,不管字段值的格式如何,都能正确处理。 - 用临时文件过渡是为了避免处理过程中损坏原文件。
重要提醒
不管用哪种方法,一定要先备份所有JSON文件,比如:
cp *.json /path/to/safe/backup/directory/
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

