当前位置: 首页 > news >正文

删除 XML 格式中双引号内的空格

要使用 Shell 命令删除 XML 格式中双引号内的空格(仅处理属性值中的空格,保留标签外的空格),可以使用以下 sed 命令

sed -i ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml

命令详解:

  1. 核心逻辑

    • s/\("[^"]*\) \([^"]*"\)/\1\2/g
      匹配双引号内的内容,将捕获分组 \1(双引号后到空格前的文本)和 \2(空格后到双引号结束的文本)合并,从而删除一个空格。
    • :loop; t loop
      通过循环重复执行替换,直到一行中所有双引号内的空格都被删除。
  2. 关键特性

    • 仅处理属性值(如 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 环境中运行,语法相同。

注意事项:

  1. 不处理转义双引号
    若属性值包含转义双引号(如 \"),此命令可能出错。复杂 XML 建议使用专业解析器(如 xmlstarlet)。
  2. 备份文件
    首次使用建议先备份文件,或去掉 -i 测试输出:
    sed ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml
    

替代方案(简单场景):

若空格仅出现在属性值中间(非开头/结尾),可用简化命令:

sed -i 's/\(="[^"]*\) /\1/g' filename.xml

此方法基于 Shell 文本处理逻辑,通过循环替换解决边界问题。对于含转义或嵌套结构的 XML,推荐使用专用工具如 xmlstarlet


相关问题

  1. 如何保留属性值中的特定空格(如英文单词间的单个空格)?
  2. 使用 awk 处理 XML 文件时,如何安全删除双引号内的空格?
  3. 若 XML 属性值包含转义字符(如 &quot;),应如何避免解析错误?
: 引用[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 变量中存在特殊字符处理
http://www.dtcms.com/a/290785.html

相关文章:

  • odoo-059 xml中字段上写 domain 和 filter_domain 什么区别
  • 对理性决策模型的剖析及应用路径
  • vue2使用v-viewer图片预览:打开页面自动预览,禁止关闭预览,解决在微信浏览器的页面点击事件老是触发预览初始化的问题
  • OpenEuler 22.03 系统上安装配置gitlab runner
  • Linux网络编程-osi、udp
  • nextjs+react接口会请求两次?
  • react class和function 如何模拟vue中的 双向绑定 监听 computed的方式
  • macbookpro m1 max本儿上速搭一个elasticsearch+kibana环境
  • Electron 主进程与渲染进程之间交互方式
  • Spring Boot自动装配原理深度解析:从核心注解到实现机制
  • Electron使用WebAssembly实现CRC-16 原理校验
  • YModem在Android上的实现(四)
  • 自动化测试概念和时机
  • Java -- 自定义异常--Wrapper类--String类
  • MySQL表的基础操作
  • 第三章自定义检视面板_创建自定义编辑器类_编扩展默认组件的显示面板(本章进度6/9)
  • 奥比中光深度相机开发
  • java学习day6 + leetcode31 下一个排列
  • 面向对象编程 - 高级篇一
  • 力扣面试150题--搜索二维矩阵
  • TPAMI 2025 | 空间频率调制(SFM),深度学习语义分割的细节守护者
  • uniapp 输入时动态修改值(如含单位)光标被强制移至末尾
  • vxe-table 通过配置 ajax 方式自动请求数据,适用于简单场景的列表
  • K8s 集群CoreDNS监控告警最佳实践
  • Django Ninja
  • 病历数智化3分钟:AI重构医院数据价值链
  • 【Prometheus+Grafana篇】监控通过Keepalived实现的MySQL HA高可用架构
  • 安全测试学习
  • Python并发编程:突破GIL枷锁,高效利用多核CPU
  • c# 获取指定路径盘的可用空间