如何在Bash脚本中去除XML同一标签内的换行与制表符 实现单标签单行
适配老版Linux环境的XML跨行标签压缩脚本
无需安装重型XML解析工具,可直接在你当前的3.13内核Ubuntu环境运行,自动清除同个XML标签内的换行、制表符,实现单标签单行的输出效果,适配后续数据提取需求。
可直接运行的Bash脚本内容
#!/bin/bash # 压缩跨行拆分的XML标签为单行输出 compact_xml() { local in_tag=0 buffer="" while IFS= read -r raw_line; do # 清理行首尾冗余空白 line=$(echo "$raw_line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//') # 跳过文件中的纯空行 [[ -z "$line" ]] && continue # 逐字符扫描识别XML标签边界 while IFS= read -n 1 char; do if [[ "$char" == "<" ]]; then in_tag=1 buffer+="$char" continue fi if [[ "$char" == ">" ]]; then in_tag=0 buffer+="$char" # 压缩标签内连续冗余空白为单个空格,输出完整标签行 echo "$buffer" | tr -s ' ' buffer="" continue fi # 标签内部的字符直接累积入缓冲区 [[ $in_tag -eq 1 ]] && buffer+="$char" done <<< "$line" # 当前行读完后如果标签未闭合,补充空格避免相邻属性拼接粘连 [[ $in_tag -eq 1 ]] && buffer+=" " done } # 从入参指定的XML文件读取内容并输出压缩结果 compact_xml < "$1"
使用方式
- 将上述内容保存为
compact_xml.sh,赋予可执行权限:chmod +x compact_xml.sh - 执行处理命令,将原XML文件压缩为单标签单行格式:
./compact_xml.sh 原XML文件路径.xml > 压缩后输出.xml
适配性说明
- 脚本全部依赖Linux系统原生的
read/sed/tr基础工具,无第三方依赖,完全兼容Ubuntu 14.04的默认环境 - 自动跳过标签之间的无意义空行,对标签内部拆分的属性、嵌套结构做换行合并,不会破坏XML本身的语法结构
- 处理效果与预期格式完全匹配:将原本跨5行的
<Device>标签、跨6行的<Param>标签,合并为不带多余换行、制表符的单行结构
内容的提问来源于stack exchange,提问作者Albert Liang
相关产品推荐
相关产品推荐

