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

Shell脚本while循环+sed命令变量替换问题修复求助

修复Shell脚本实现变量替换需求

原脚本的核心问题

  1. 输出文件反复被覆盖:循环中每次执行sed ... testfile3.txt > output_21aug.txt都会从原始模板文件读取内容,替换后直接覆盖输出文件,导致之前的替换结果全部丢失,最终仅保留最后一次替换的效果。
  2. 替换目标匹配错误:原脚本仅替换变量名本身(如mysite.mw_path),但实际需要替换的是被@包裹的完整字符串(如@mysite.mw_path@)。
  3. 逻辑冗余且效率低下:逐行读取模板文件并反复调用sed修改,不如先加载所有变量映射,再一次性完成全局替换。

修复后的脚本

#!/bin/bash

# 检查参数数量是否正确
if [ $# -ne 2 ]; then
    echo "用法: $0 <模板文件> <变量文件>"
    exit 1
fi

TEMPLATE_FILE="$1"
VAR_FILE="$2"
OUTPUT_FILE="output_21aug.txt"

# 复制模板文件作为输出文件的初始内容
cp "$TEMPLATE_FILE" "$OUTPUT_FILE"

# 读取变量文件中的键值对,批量执行替换
while IFS='=' read -r key value; do
    # 跳过空行和注释行
    if [[ -z "$key" || "$key" =~ ^# ]]; then
        continue
    fi
    # 全局替换所有@key@为@value@
    sed -i "s|@${key}@|@${value}@|g" "$OUTPUT_FILE"
done < "$VAR_FILE"

脚本说明

  1. 参数校验:确保用户传入正确数量的模板文件和变量文件参数。
  2. 初始化输出文件:直接复制模板文件内容到输出文件,保证初始内容与模板一致。
  3. 批量变量替换:逐行读取变量文件的键值对,跳过无效行后,通过sed -i原地修改输出文件,一次性替换所有匹配的@变量名@为@对应值@。

验证效果

执行命令:

./test_script.sh testfile1.txt testfile2.txt

最终output_21aug.txt将得到预期结果:

## START :: start of file ##
path.mw.site.profiles=@/mw/mysite/cfg/DATA1/@
#
path.mw.site.broker.profiles=@/usr/local/mw/mysite/cfg/DATA2/@
#
path.mw.site.profiles=@/mw/mysite/cfg/DATA1/@
#
path.mw.site.broker.profiles=@/usr/local/mw/mysite/cfg/DATA2/@
## END :: end of file #

若不需要保留前后的@符号,只需将替换规则修改为sed -i "s|@${key}@|${value}|g" "$OUTPUT_FILE"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:47