我期待创建一个基于简单测试条件的快速shell脚本(HP-UX系统)来删除XML标记。由于种种原因,我无法使用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 ,感谢您的输入,将更新帖子。它是一个大文件的一部分,并将用作输入。预期的输出在解释中解释,但会以任何方式更新。 – Monty
@EdMorton,不幸的是没有GNU awk可用。 – Monty