删除 XML 格式中双引号内的空格
要使用 Shell 命令删除 XML 格式中双引号内的空格(仅处理属性值中的空格,保留标签外的空格),可以使用以下 sed 命令:
sed -i ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml
命令详解:
- 
核心逻辑: - s/\("[^"]*\) \([^"]*"\)/\1\2/g:
 匹配双引号内的内容,将捕获分组- \1(双引号后到空格前的文本)和- \2(空格后到双引号结束的文本)合并,从而删除一个空格。
- :loop; t loop:
 通过循环重复执行替换,直到一行中所有双引号内的空格都被删除。
 
- 
关键特性: - 仅处理属性值(如 name="John Doe"→name="JohnDoe"),标签外的空格(如缩进、换行)保留不变。
- 支持一行内多个属性(如 <tag a="val 1" b="val 2">→<tag a="val1" b="val2">)。
 
- 仅处理属性值(如 
示例验证:
输入 XML:
<data><item name="Product 123" price="100 USD"/><info desc="A test example" />
</data>
执行命令后:
<data><item name="Product123" price="100USD"/><info desc="Atestexample" />
</data>
系统适配:
- Linux/macOS(BSD sed):
 直接运行上述命令(macOS 需先安装 GNU sed,或改用sed -i '' '...')。
- Windows(Git Bash/WSL):
 确保在 Bash 环境中运行,语法相同。
注意事项:
- 不处理转义双引号:
 若属性值包含转义双引号(如\"),此命令可能出错。复杂 XML 建议使用专业解析器(如xmlstarlet)。
- 备份文件:
 首次使用建议先备份文件,或去掉-i测试输出:sed ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml
替代方案(简单场景):
若空格仅出现在属性值中间(非开头/结尾),可用简化命令:
sed -i 's/\(="[^"]*\) /\1/g' filename.xml
此方法基于 Shell 文本处理逻辑,通过循环替换解决边界问题。对于含转义或嵌套结构的 XML,推荐使用专用工具如
xmlstarlet。
相关问题
- 如何保留属性值中的特定空格(如英文单词间的单个空格)?
- 使用 awk处理 XML 文件时,如何安全删除双引号内的空格?
- 若 XML 属性值包含转义字符(如 "),应如何避免解析错误?
- 
: 引用[2]: shell中空格的使用;空格替换;通配符。空格替换  将多个空格替换为一个空格 sed ‘s/[ ][ ]/ /g’ filename sed -e 's/[[:space:]][[:space:]]/ /g’ filename 将1到10个空格替换为一个空格 sed ‘s/[ ]{1,10}/ /g’ filename 去掉多余空格 echo “hello world” | tr -s ‘[[:space:]]’ http://www.runoob.com/linux/linux-comm-tr.html http://wiki.jikexueyuan.com/project/unix/regular-expressions.html
- 引用[1]:【Shell】Sed 删除、替换、增加字符串。方式3: 使用单引号,变量直接引用,但是需要通过 eval 执行这个sed命令。eval会对后面Shell命令进行两遍扫描,如果第一遍扫描后,Shell命令是个普通命令,则执行此命令;如果Shell命令是含有变量的间接引用,则保证间接引用的语义 #!/bin/bash name=tomas eval sed -i ‘s/rose/${name}/g’ name.txt 变量中存在特殊字符处理
