如何用Bash与JQ将JSON二级键转为空格分隔的HTML文件名串?
问题场景
有如下JSON源文件:
{ "admin-user" : { "index.md": "Index", "user_profil.md": "User Profil" } }
需要通过Bash和JQ完成两个操作:
- 提取所有二级键(如
index.md、user_profil.md) - 将这些键的
.md后缀替换为.html,最终拼接成空格分隔的字符串
用户尝试的代码如下:
KEYS=$(cat test.json | jq -r '.[]|keys') concat_string="" for i in $KEYS do md_name=${i/.md/.html} concat_string="$concat_string$md_name" done echo $concat_string
得到的结果是数组格式:["index.html","user_profil.html"],不符合空格分隔的需求。
解决方案
推荐直接用JQ内置函数完成所有处理,无需额外Bash循环,更简洁高效:
jq -r '.[] | keys | map(gsub("\\.md$"; ".html")) | join(" ")' test.json
代码说明
.[]:遍历顶层所有对象,自动适配未知或变化的一级键keys:提取当前对象的所有二级键,生成数组map(gsub("\\.md$"; ".html")):遍历数组元素,将每个元素末尾的.md替换为.htmljoin(" "):将处理后的数组用空格拼接成字符串-r:输出原始纯文本(不带JSON的引号和数组结构)
执行后直接得到目标结果:
index.html user_profil.html
如果坚持使用Bash循环的思路,需要先让JQ逐行输出每个二级键,再循环处理:
concat_string="" while read -r key; do md_name="${key/.md/.html}" concat_string="$concat_string $md_name" done < <(jq -r '.[] | keys[]' test.json) # 移除开头多余的空格 echo "${concat_string# }"
内容的提问来源于stack exchange,提问作者toni
相关产品推荐
相关产品推荐

