如何在Shell中将多行JSON变量转换为单行?
解决Shell多行JSON变量转单行问题
问题根源
你之前的命令失效,核心原因是未加引号展开变量:echo $var1会让Shell把变量内的换行、连续空格替换成单个空格,还会触发分词,导致变量内容被截断或篡改,后续的tr和base64处理的是不完整的内容。
可行解决方案
方案1:用jq生成合法单行JSON(推荐)
jq是专业JSON处理工具,能自动转义字符串内的换行符,保证JSON语法完全合法,同时压缩为单行:
echo "$var1" | jq -c .
-c参数表示紧凑输出,即单行格式- 处理后,
private_key字段内的换行会被转义为\n,既保留密钥内容,又符合JSON规范
方案2:手动删除换行并压缩空格(适合无jq环境)
如果没有安装jq,可以用基础工具组合,仅删除JSON结构的换行,同时避免破坏字符串内容:
echo "$var1" | tr -d '\n' | sed 's/[[:space:]]\+/ /g'
echo "$var1":带双引号输出,完整保留变量内的所有字符(包括换行和引号)tr -d '\n':删除所有换行符sed 's/[[:space:]]\+/ /g':将连续的空白字符(空格、制表符等)压缩为单个空格,保证JSON格式整洁
验证编码/解码完整性
如果需要转成单行后再base64编码,用以下流程确保内容完整:
# 生成单行JSON并编码 encoded_str=$(echo "$var1" | jq -c . | base64) # 解码验证 echo "$encoded_str" | base64 -d
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

