提取具有子标签的标签之间的内容

提取具有子标签的标签之间的内容

使用“xmlstarlet”或“sed”或“awk”或一些类似工具从文件中提取所需的内容。该流程应该引用特定业务流程的全名,然后应该只提取该特定业务流程之间的内容。

要从中提取内容的文件。

 <businessProcesses>
        <fullName>Customer Support</fullName>
        <description>Use for Customer Support, TDG and Port</description>
        <isActive>true</isActive>
        <values>
            <fullName>Action Item</fullName>
            <default>false</default>
        </values>
        <values>
            <fullName>Solved</fullName>
            <default>false</default>
        </values>
    </businessProcesses>
    <businessProcesses>
        <fullName>Customer Support - Port</fullName>
        <description>Telecom team use only</description>
        <isActive>true</isActive>
        <values>
            <fullName>New</fullName>
            <default>true</default>
        </values>
        <values>
            <fullName>Open</fullName>
            <default>false</default>
        </values>
    </businessProcesses>
</CustomObject>    

所需的输出。

<businessProcesses>
        <fullName>Customer Support - Port</fullName>
        <description>Telecom team use only</description>
        <isActive>true</isActive>
        <values>
            <fullName>New</fullName>
            <default>true</default>
        </values>
        <values>
            <fullName>Open</fullName>
            <default>false</default>
        </values>
    </businessProcesses> 

答案1

假设 XML 格式良好(示例缺少CustomObject开始标记),

$ xmlstarlet sel -t -c '//businessProcesses[fullName="Customer Support - Port"]' -nl  file.xml
<businessProcesses>
        <fullName>Customer Support - Port</fullName>
        <description>Telecom team use only</description>
        <isActive>true</isActive>
        <values>
            <fullName>New</fullName>
            <default>true</default>
        </values>
        <values>
            <fullName>Open</fullName>
            <default>false</default>
        </values>
    </businessProcesses>

这使用带有 XPATH 查询的 XMLStarlet,该查询提取具有精确值的子节点businessProcesses的节点的副本。fullNameCustomer Support - Port

最后-nl在输出中添加换行符。


不要将 XMLStarlet 或任何其他结构化文档格式解析器与面向行的文本操作工具(如sed、 或 )进行比较awk

答案2

您可以获得所需的输出(带有额外的空格)

awk 'NR==1 || (NR >= 15 && NR <= 26)'

或者

sed -n '1p; 15,26p'

如果您想要更好的答案,请提出更好的问题。

相关内容