【发布时间】:2018-02-18 23:10:27
【问题描述】:
我希望创建一个快速的 shell 脚本(HP-UX 系统)来根据一个简单的测试条件删除 XML 标记。我不能使用像“xmlstarlet”这样的 XML 感知工具,因为出于多种原因,这些工具在我的生产系统上不可用。我确实知道这些是正确的方法,但在这件事上我别无选择。
考虑以下与两个设备相关的两个 XML 元素。当设备无法通信时,将没有 StationId 和 HardwareInv,标签与最后的 <..../> 不同。当设备处于通讯状态,StationId 存在且 HardwareInv 内容可用时,开始/结束标签是完整的,即</....> 在结束。
我想通过搜索<StationId/> 和/或<HardwareInv/> 来查找和删除通信外的设备,如果找到,则完全删除关联的DeviceA 标签之间的所有内容,包括DeviceA 标签本身,不留空白排在后面。
我已经尝试了一些不同的结果,特别是使用“sed”,但没有 100% 成功。非常感谢您的帮助。
这是输入的 XML 文件:
<DeviceA>
<PhysicalAdd>10.10.10.69</PhysicalAdd>
<NEId>0000-Test-06</NEId>
<StationId/>
*** MORE CONTENT REMOVED ***
<HardwareInv/>
</DeviceA>
<DeviceA>
<PhysicalAdd>10.10.10.109</PhysicalAdd>
<NEId>0000-Test-13</NEId>
<StationId>Bravo-01</StationId>
*** MORE CONTENT REMOVED ***
<HardwareInv>
<Unit>
<UnitId>1</UnitId>
<SerialNumber>1389A</SerialNumber>
</Unit>
</HardwareInv>
</DeviceA>
预期输出:
<DeviceA>
<PhysicalAdd>10.10.10.109</PhysicalAdd>
<NEId>0000-Test-13</NEId>
<StationId>Bravo-01</StationId>
*** MORE CONTENT REMOVED ***
<HardwareInv>
<Unit>
<UnitId>1</UnitId>
<SerialNumber>1389A</SerialNumber>
</Unit>
</HardwareInv>
</DeviceA>
【问题讨论】:
-
@EdMorton,感谢您的意见,将更新帖子。它是大文件的一部分,将用作输入。解释中解释了预期的输出,但会以任何方式更新帖子。
-
@EdMorton,很遗憾没有可用的 GNU awk。