You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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替换为.html
  • join(" "):将处理后的数组用空格拼接成字符串
  • -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:30:29