如何用jq将Bash脚本输出格式化为指定JSON并添加自定义值
使用jq将Bash输出转换为指定JSON结构的解决方案
需求说明
需要将Bash输出的多行键值对文本,通过jq工具转换为包含子层级结构的JSON,同时在指定位置添加固定自定义字段"s": "mycustomvalue",并且支持多组输入数据生成对应数组元素。
原始输入
"value1: myv1", "value2: myv2", "value3: myv3", "value4: myv4", "value5: myv5", "value6: myv6", "value7: myv7"
期望输出
{ "g": [{ "m": "myv1", "v": "myv6", "t": "myv3", "d": { "a": "myv2", "r": "myv5", "s": "mycustomvalue", "o": "myv4", "n": "myv7" } }, { "m": "myv1", "v": "myv6", "t": "myv3", "d": { "a": "myv2", "r": "myv5", "s": "mycustomvalue", "o": "myv4", "n": "myv7" } } ] }
解决方案
单组输入转换命令
如果先处理单组输入,将原始文本转为目标结构的单个对象:
cat input.txt | jq -n ' reduce inputs as $line ({}; ($line | gsub("[\" ,]"; "") | split(":")) as [$key, $val] | .[$key] = $val ) | { g: [{ m: .value1, v: .value6, t: .value3, d: { a: .value2, r: .value5, s: "mycustomvalue", o: .value4, n: .value7 } }] }'
多组输入处理说明
如果有多组输入(比如多份类似的键值对块,用空行分隔),可使用以下命令批量转换并生成数组:
awk 'BEGIN{RS=""}1' input_multiple.txt | while read -r block; do echo "$block" | jq -n ' reduce inputs as $line ({}; ($line | gsub("[\" ,]"; "") | split(":")) as [$key, $val] | .[$key] = $val ) | { m: .value1, v: .value6, t: .value3, d: { a: .value2, r: .value5, s: "mycustomvalue", o: .value4, n: .value7 } }' done | jq -s '{g: .}'
命令解释
- 解析原始输入:通过
reduce遍历每一行输入,先清理字符串中的引号、逗号和空格,再按冒号分割键值对,存入临时对象。 - 构建目标结构:从临时对象中提取对应值,组装成包含子层级
d的对象,同时直接插入自定义字段s: "mycustomvalue"。 - 多组处理:用
awk按空行分割多组输入,每组单独转换为JSON对象后,用jq -s将所有对象收集到g数组中。
内容的提问来源于stack exchange,提问作者J.S
相关产品推荐
相关产品推荐

