Shell脚本while循环+sed命令变量替换问题修复求助
修复Shell脚本实现变量替换需求
原脚本的核心问题
- 输出文件反复被覆盖:循环中每次执行
sed ... testfile3.txt > output_21aug.txt都会从原始模板文件读取内容,替换后直接覆盖输出文件,导致之前的替换结果全部丢失,最终仅保留最后一次替换的效果。 - 替换目标匹配错误:原脚本仅替换变量名本身(如
mysite.mw_path),但实际需要替换的是被@包裹的完整字符串(如@mysite.mw_path@)。 - 逻辑冗余且效率低下:逐行读取模板文件并反复调用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"
脚本说明
- 参数校验:确保用户传入正确数量的模板文件和变量文件参数。
- 初始化输出文件:直接复制模板文件内容到输出文件,保证初始内容与模板一致。
- 批量变量替换:逐行读取变量文件的键值对,跳过无效行后,通过
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
相关产品推荐
相关产品推荐

