sed变量引用报错,求XML合并脚本修正及可选正则方案
问题分析与解决方案
原脚本错误原因
你遇到的 sed: -e expression #1, char 1: unknown command: ''` 错误,根源在于变量引用时的引号混乱。原脚本用普通字符串变量存储sed规则,混合使用单双引号导致变量展开后出现未闭合的引号或特殊字符,sed无法正确解析表达式。
修复后的脚本(满足所有需求)
#!/bin/bash # 配置输出路径(可根据需要修改) OUTDIR="./merged_xml" OUTFILE="combined_output.xml" mkdir -p "$OUTDIR" # 定义各规则集合(数组形式,避免引号问题) # 规则1:移除XML头(单独一行或行首的XML声明) rule_xml_header=( '-e' '/^ *<\?xml[^>]*>$/d' '-e' 's/^ *<\?xml[^>]+>//' ) # 规则2:删除空行(包括仅含空白字符的行) rule_empty_lines=( '-e' '/^[[:space:]]*$/d' ) # 规则3:移除行首空格和制表符 rule_leading_whitespace=( '-e' 's/^[ \t]*//' ) # 提示用户选择要启用的规则 echo "请选择要应用的规则(输入逗号分隔的数字,例如1,2):" echo "1. 移除XML头(单独行或行首的声明)" echo "2. 删除空行" echo "3. 移除行首空格/制表符" read -p "你的选择:" selection # 初始化sed参数数组 sed_args=() # 解析用户选择,组装sed参数 IFS=',' read -ra choices <<< "$selection" for choice in "${choices[@]}"; do case "$choice" in 1) sed_args+=("${rule_xml_header[@]}") ;; 2) sed_args+=("${rule_empty_lines[@]}") ;; 3) sed_args+=("${rule_leading_whitespace[@]}") ;; *) echo "警告:无效选项 $choice,已忽略" ;; esac done # 检查是否选择了有效规则 if [ ${#sed_args[@]} -eq 0 ]; then echo "错误:未选择有效规则,退出" exit 1 fi # 处理每个XML文件并合并到输出 while read -r xmldat; do [ -z "$xmldat" ] && continue if [ -f "$xmldat" ]; then sed "${sed_args[@]}" "$xmldat" >> "$OUTDIR/$OUTFILE" else echo "警告:文件 $xmldat 不存在,已跳过" fi done <<< "$files" echo "合并完成,输出文件路径:$OUTDIR/$OUTFILE"
关键改进点
- 使用bash数组存储规则:每个sed
-e表达式作为数组独立元素,彻底避免引号展开问题,确保sed能正确解析每个规则。 - 用户可选规则组合:通过交互式选择,支持任意1/2/3个规则的组合应用。
- 兼容非标准XML:基于行的文本处理,无需依赖XML解析工具,适用于无闭合标签等畸形XML。
- 易于扩展规则:新增规则只需:
- 定义新的规则数组(如
rule_new=( '-e' 'your_regex_here' )) - 在提示信息中添加对应选项
- 在
case语句中增加匹配分支
- 定义新的规则数组(如
使用说明
- 确保变量
$files已正确存储待处理的XML文件列表(每行一个文件路径)。 - 运行脚本,根据提示输入规则编号组合(如
1,3表示启用移除XML头和行首空白的规则)。 - 合并后的文件会生成在指定的
OUTDIR目录下。
内容的提问来源于stack exchange,提问作者Stahler
相关产品推荐
相关产品推荐

