MacOS下如何用sed替换JSON特定Key值中的连字符为下划线
解决MacOS下特定JSON Key数组内连字符替换为下划线的问题
方法一:使用jq(推荐,适合大型/复杂JSON)
jq是专门处理JSON的工具,MacOS可通过brew install jq安装。它能精准识别JSON结构,避免正则处理带来的格式兼容问题。
执行以下命令完成替换:
jq '."key" |= map(gsub("-"; "_"))' input.json > output.json
命令说明:
."key":定位到名为key的目标字段|= map(...):对该字段的数组值逐个元素处理gsub("-"; "_"):将每个数组元素中的所有连字符-替换为下划线_- 其他字段的内容完全保持不变
示例效果:
输入JSON:
{ "key": ["test-value-1", "value-2"], "anotherKey": "unrelated-value" }
运行命令后输出:
{ "key": ["test_value_1", "value_2"], "anotherKey": "unrelated-value" }
方法二:使用MacOS自带的BSD sed
如果坚持用sed处理,需编写循环替换逻辑,确保仅修改"key": [和]范围内的连字符:
单行JSON处理命令:
sed -E ':a; s/("key": \[[^]]*)-([^]]*\])/\1_\2/; ta' input.json
命令说明:
:a:定义循环标签as/("key": \[[^]]*)-([^]]*\])/\1_\2/:匹配"key": [后到]前的任意-,替换为_ta:若替换成功,回到标签a继续循环,直到该范围内无-可替换
示例效果:
$ echo '{"key": ["test-value-1", "value-2"], "anotherKey": "unrelated-value"}' | sed -E ':a; s/("key": \[[^]]*)-([^]]*\])/\1_\2/; ta' {"key": ["test_value_1", "value_2"], "anotherKey": "unrelated-value"}
注意事项:
sed依赖文本格式,若JSON为多行结构(比如数组元素换行),sed可能无法正确匹配,这种场景下优先使用jq。
内容的提问来源于stack exchange,提问作者gtrochimiuk
相关产品推荐
相关产品推荐

