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

Bash脚本修改Hugo.toml嵌套值异常,求可靠处理[languages.xx.params]方法

可靠处理Hugo TOML配置中多语言Slogan的方案

推荐方案:使用tomlq(结构化TOML处理)

纯文本工具(sed/awk)处理TOML容易因格式变化(空格、换行、注释等)出错,用专门的TOML查询工具tomlq能完美解决层级创建和键更新的可靠性问题。

步骤:

  1. 安装tomlq
    tomlq是yq的TOML分支,可通过pip安装:

    pip install yq
    

    部分系统包管理器也直接提供(比如Ubuntu的python3-yq包)。

  2. 完整脚本实现

    #!/bin/bash
    CONFIG_FILE="hugo.toml"
    
    # 提取所有已配置的语言代码
    languages=$(tomlq '.languages | keys[]' "$CONFIG_FILE")
    
    for lang in $languages; do
        # 提示用户输入对应语言的slogan
        read -p "请输入语言[$lang]的slogan: " slogan
    
        # 插入/更新目标键,自动创建params层级(不存在时)
        tomlq -i ".languages.$lang.params.slogan = \"$slogan\"" "$CONFIG_FILE"
    
        # 处理对应语言的_index.md(你已实现,此处为示例)
        content_file="content/$lang/_index.md"
        if grep -q "{{< slogan >}}" "$content_file"; then
            echo "[$lang]的_index.md已包含slogan短代码,跳过"
        else
            echo "{{< slogan >}}" >> "$content_file"
            echo "已为[$lang]的_index.md添加slogan短代码"
        fi
    done
    
    echo "所有语言的slogan配置已完成"
    

方案优势:

  • 自动处理层级:若[languages.xx.params]不存在,tomlq会自动创建该section及对应键
  • 精准定位:不受注释、空格或换行影响,不会出现匹配错误
  • 避免重复:直接替换已存在的slogan键,不会重复添加
  • 支持特殊字符:自动转义slogan中的特殊符号,符合TOML语法规范

纯Bash备选方案(无外部工具依赖)

若无法安装tomlq,可使用sed结合文本处理逻辑,但要求TOML格式规范(每个语言块为独立的[languages.xx] section,且内部键缩进统一):

#!/bin/bash
CONFIG_FILE="hugo.toml"

# 提取所有语言代码(依赖规范的[languages.xx]格式)
languages=$(grep -E '^\[languages\.[a-z]+\]' "$CONFIG_FILE" | sed -E 's/\[languages\.([a-z]+)\]/\1/')

for lang in $languages; do
    read -p "请输入语言[$lang]的slogan: " slogan
    lang_section="languages.$lang"
    params_section="[$lang_section.params]"
    slogan_line="  slogan = \"$slogan\""

    # 检查params section是否存在
    if grep -q "$params_section" "$CONFIG_FILE"; then
        # 检查slogan键是否存在,存在则替换,否则追加到params section末尾
        if grep -A 10 "$params_section" "$CONFIG_FILE" | grep -q '^[[:space:]]*slogan ='; then
            sed -i "/$params_section/,/^\[/ s/^[[:space:]]*slogan = .*/$slogan_line/" "$CONFIG_FILE"
        else
            sed -i "/$params_section/ a\\$slogan_line" "$CONFIG_FILE"
        fi
    else
        # 在[languages.xx] section末尾添加params section和slogan
        sed -i "/^\[languages\.$lang\]/,/^\[/ {
            /^\[/ !{
                $a\\
$params_section\\
$slogan_line
            }
        }" "$CONFIG_FILE"
    fi

    # 处理_index.md部分
    content_file="content/$lang/_index.md"
    if ! grep -q "{{< slogan >}}" "$content_file"; then
        echo "{{< slogan >}}" >> "$content_file"
    fi
done

echo "配置更新完成"

注意事项:

  • 要求TOML格式规范:每个语言section[languages.xx]后为该语言配置,下一个section以[开头
  • 缩进需统一(示例用2个空格),否则sed匹配可能出错
  • 不支持带换行或正则特殊字符的slogan,需手动转义

内容的提问来源于stack exchange,提问作者WilOnWeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:16:13