如何通过shell命令匹配JSON指定规则ID并修改其Status为Disabled
实现方案
处理结构化JSON优先使用专门的JSON处理工具jq,稳定性远高于文本处理工具sed,不会受JSON排版格式影响,同时也提供sed方案适配你的需求。
方案1:jq实现(推荐)
jq是专门面向JSON的命令行处理工具,会严格按照JSON结构操作,不会出现误修改问题,大多数Linux发行版默认预装,无预装可直接通过包管理器安装。
命令:
# 仅输出修改后的内容,不修改原文件 jq '.Rules[] |= if .ID | contains("-FULL-HISTORY-DATA") then .Status = "Disabled" else . end' 你的文件路径.json # 直接修改原文件(jq 1.6及以上版本支持) jq -i '.Rules[] |= if .ID | contains("-FULL-HISTORY-DATA") then .Status = "Disabled" else . end' 你的文件路径.json # 低版本jq修改原文件兼容方案 jq '.Rules[] |= if .ID | contains("-FULL-HISTORY-DATA") then .Status = "Disabled" else . end' 你的文件路径.json > tmp.json && mv tmp.json 你的文件路径.json
方案2:sed实现(仅适用于当前固定排版的JSON)
该方案依赖你当前JSON的固定缩进、行顺序结构,若后续JSON排版变动(比如行顺序调整、缩进变化)可能失效。原理是匹配到包含指定字符串的ID行后,向后查找第一个Status行做替换,不会修改其他规则的Status值。
命令:
# 仅输出修改后的内容,不修改原文件(GNU sed) sed '/"ID": ".*-FULL-HISTORY-DATA.*",/{:a;n;/Status":/s/"Enabled"/"Disabled"/;ba}' 你的文件路径.json # 直接修改原文件(GNU sed,比如CentOS、Ubuntu默认sed) sed -i '/"ID": ".*-FULL-HISTORY-DATA.*",/{:a;n;/Status":/s/"Enabled"/"Disabled"/;ba}' 你的文件路径.json # 直接修改原文件(macOS自带sed) sed -i '' '/"ID": ".*-FULL-HISTORY-DATA.*",/{:a;n;/Status":/s/"Enabled"/"Disabled"/;ba}' 你的文件路径.json
内容的提问来源于stack exchange,提问作者Zack_Coder
相关产品推荐
相关产品推荐

