PowerShell如何精准替换JSON中objectStatus键对应值(兼容多空格)
PowerShell批量替换JSON指定键值实现方案
问题背景
- 目录下存在多层级文件夹,存放大量JSON文件,需要批量修改指定字段内容
- 目标修改规则:仅将键
objectStatus对应的ACTIVE值替换为INACTIVE - 兼容要求:键和值之间可能存在任意数量的空格,例如
"objectStatus": "ACTIVE",这类格式也需要正常识别 - 原有脚本问题:全局替换所有
"ACTIVE"字符串,会误修改其他键名下的同名值,不符合需求
原有脚本如下:
$jsonFiles = Get-ChildItem . *.json -rec foreach ($file in $jsonFiles) { (Get-Content $file.PSPath) | Foreach-Object {$_ -replace '"ACTIVE"','"INACTIVE"'} | Set-Content $file.PSPath }
调整后脚本
核心修改点是用正则精准匹配目标键值对,通过捕获组保留原有键值之间的空格格式,不会误匹配其他位置的ACTIVE值:
$jsonFiles = Get-ChildItem -Path . -Filter *.json -Recurse foreach ($file in $jsonFiles) { (Get-Content $file.PSPath -Raw -Encoding UTF8) | Foreach-Object { # 正则仅匹配objectStatus键后跟随任意空白字符的"ACTIVE"值 $_ -replace '("objectStatus":\s*)"ACTIVE"', '$1"INACTIVE"' } | Set-Content $file.PSPath -Encoding UTF8 }
逻辑说明
- 正则表达式
("objectStatus":\s*)"ACTIVE"中,括号内的内容是捕获组,会先匹配固定键名"objectStatus":,再匹配后面任意数量(包含0个)的空白字符(空格、制表符都可识别),只有后续紧跟"ACTIVE"时才会触发替换 - 替换时用
$1引用捕获组拿到的键名+原有空白内容,后面拼接新值"INACTIVE",完全保留原文件的排版格式,不会改动原有空格缩进 - 加上
-Raw参数一次性读取整个文件内容,兼容键值对跨行拆分的极端场景;添加-Encoding UTF8参数避免文件读写出现乱码 - 其他键下的
"ACTIVE"值因为前面没有匹配的objectStatus键,完全不会被替换,解决了全局误替换的问题
注意:运行脚本前建议先备份少量文件测试效果,确认符合预期后再全量执行。
内容的提问来源于stack exchange,提问作者Anand Rajakrishnan
相关产品推荐
相关产品推荐

