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

Shell脚本循环用sed多匹配替换不同值批量生成目标文件方法

Shell脚本实现CSV字段替换XML模板批量生成输出

核心实现逻辑

  • 预加载XML模板内容到内存,减少重复磁盘IO
  • 逐行解析逗号分隔的输入文件,剥离字段前后的空白、双引号得到纯净替换值
  • 通过sed多规则顺序执行完成双占位符替换,逐行写入结果文件

前置文件约定

  • file.txt:输入文件,每行以逗号分隔两个带双引号的字符串,允许行首存在缩进空白
  • template.txt:XML模板文件,单行存储,包含var_1、var_2两个占位符,允许行首行尾存在空白
  • result.txt:最终生成的输出文件

可直接运行的脚本实现

版本1:Shell循环+sed多匹配替换(对应需求中要求的sed实现方式)

#!/bin/bash
INPUT_FILE="file.txt"
TEMPLATE_FILE="template.txt"
OUTPUT_FILE="result.txt"

# 读取模板并去除首尾空白
template=$(sed 's/^[[:space:]]*//;s/[[:space:]]*$//' "$TEMPLATE_FILE")
# 清空已有输出文件
> "$OUTPUT_FILE"

# 逐行读取输入,兼容最后一行无换行场景
while IFS=',' read -r raw_v1 raw_v2 || [[ -n "$raw_v1" ]]; do
    # 清洗字段:去除前后空白、包裹的双引号
    v1=$(sed 's/^[[:space:]]*"//;s/"[[:space:]]*$//' <<< "$raw_v1")
    v2=$(sed 's/^[[:space:]]*"//;s/"[[:space:]]*$//' <<< "$raw_v2")
    
    # 单sed进程传多个-e参数,顺序执行两次替换
    sed -e "s/var_1/$v1/g" -e "s/var_2/$v2/g" <<< "$template" >> "$OUTPUT_FILE"
done < "$INPUT_FILE"

sed多替换实现说明

sed支持传入多个-e参数指定多条编辑命令,命令会按照传入顺序依次对文本执行修改,不需要多次调用sed搭建管道,执行效率更高。

注意:如果待替换的字符串包含/、&等sed正则特殊字符,可将替换分隔符改为字符串中不存在的字符(例如|、#),写法调整为s|var_1|$v1|g即可避免转义问题。


版本2:awk单命令实现(大文件场景性能更优)

如果输入文件行数达到万级以上,shell循环的性能会明显下降,可以直接用awk单命令完成全流程处理,不需要启动额外进程:

#!/bin/bash
awk -F',' '
BEGIN {
    # 读取并清洗模板
    while ((getline tpl < "template.txt") > 0) {
        gsub(/^[[:space:]]+|[[:space:]]+$/, "", tpl)
        template = tpl
    }
    close("template.txt")
}
{
    # 清洗两个输入字段
    gsub(/^[[:space:]]*"|"[[:space:]]*$/, "", $1)
    gsub(/^[[:space:]]*"|"[[:space:]]*$/, "", $2)
    # 替换占位符输出
    res = template
    gsub(/var_1/, $1, res)
    gsub(/var_2/, $2, res)
    print res
}
' file.txt > result.txt

运行效果

执行脚本后生成的result.txt内容与需求要求的目标格式完全一致,每行对应一条替换完成的XML结构,无多余空白、引号残留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:54:26