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
相关产品推荐
相关产品推荐

