Bash脚本修改Hugo.toml嵌套值异常,求可靠处理[languages.xx.params]方法
可靠处理Hugo TOML配置中多语言Slogan的方案
推荐方案:使用tomlq(结构化TOML处理)
纯文本工具(sed/awk)处理TOML容易因格式变化(空格、换行、注释等)出错,用专门的TOML查询工具tomlq能完美解决层级创建和键更新的可靠性问题。
步骤:
安装tomlq
tomlq是yq的TOML分支,可通过pip安装:pip install yq部分系统包管理器也直接提供(比如Ubuntu的
python3-yq包)。完整脚本实现
#!/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
相关产品推荐
相关产品推荐

