如何在Bash中将格式化JSON转为无空格换行的压缩格式?
解决方案:将格式化JSON转为紧凑格式用于Bash命令
要把格式化的JSON转成无冗余空格、无换行的紧凑格式,最稳妥的方式是用专门的JSON处理工具,避免手动正则破坏JSON结构。下面给你几种实用方法:
1. 推荐:用jq(最可靠的JSON工具)
jq是处理JSON的标准工具,几乎所有Linux发行版都能通过包管理器安装(比如apt install jq或yum install jq)。它能安全压缩JSON,不会误处理字符串内的空格或特殊字符:
直接输出紧凑JSON
jq -c . your_formatted.json
-c参数表示"compact output",会把整个JSON压缩成一行,自动移除不必要的空格和换行。
在脚本中使用示例
假设你的foo.sh原本是这样(无法正常工作,因为格式化JSON的换行/空格会被Shell拆分):
# 错误示例:格式化JSON作为参数会被Shell拆分 some_function "$(cat file.json)"
改成用jq后:
# 正确示例:传递紧凑格式的JSON字符串 COMPACT_JSON=$(jq -c . file.json) some_function "$COMPACT_JSON"
2. 备用:用Python(无需额外安装)
如果系统没有jq,Python是几乎所有Linux/macOS系统都预装的工具,同样能安全处理JSON:
方法一:用内置的json.tool
python -m json.tool --compact file.json
--compact参数会直接输出紧凑格式的JSON。
方法二:用单行脚本
python -c "import json, sys; print(json.dumps(json.load(sys.stdin)))" < file.json
这个命令从标准输入读取格式化JSON,然后输出紧凑版本。
3. 不推荐:用sed/awk(仅限简单JSON)
如果你的JSON结构非常简单(字符串内没有空格、换行或特殊字符),可以用sed做粗暴替换,但绝对不推荐用于复杂JSON(会破坏字符串内的空格):
sed ':a;N;$!ba;s/\s\+//g' file.json
这个命令会把所有空白字符(空格、换行、制表符)全部移除,但如果JSON里有"description": "hello world"这样的字符串,会变成"description":"helloworld",完全破坏原意。
示例验证
假设你的格式化file.json是:
{ "key1": "value with space", "key2": 456, "key3": ["a", "b", "c"] }
用jq -c . file.json会输出:
{"key1":"value with space","key2":456,"key3":["a","b","c"]}
这个结果可以安全地作为参数传递给其他函数,不会被Shell拆分。
内容的提问来源于stack exchange,提问作者flor1an
相关产品推荐
相关产品推荐

