用于XML块的正则表达式

时间:2018-06-13 20:25:00

标签: regex bash sed

很抱歉这个生硬的问题,需要一些关于如何在xml doc中模式匹配块的快速提示。

xml看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<NameSet xmlns="http://soap.sforce.com/2006/04/metadata">
   <applicationVisibilities>
        <application>standard__Service</application>
        <visible>false</visible>
    </applicationVisibilities>
    <applicationVisibilities>
        <application>standard__ServiceConsole</application>
        <visible>false</visible>
    </applicationVisibilities>
    <classAccesses>
        <apexClass>APAC_AddCampaignMembersController</apexClass>
        <enabled>false</enabled>
    </classAccesses>
    <classAccesses>
        <apexClass>APAC_CampaignLogicRedirectClassTestClass</apexClass>
        <enabled>false</enabled>
    </classAccesses>
    <classAccesses>
        <apexClass>APAC_CampaignLogicUtilitiesTestClass</apexClass>
        <enabled>false</enabled>
    </classAccesses>
    <classAccesses>
        <apexClass>APAC_CampaignPropertyTriggerHelper</apexClass>
        <enabled>false</enabled>
    </classAccesses>
    <classAccesses>
        <apexClass>APAC_ConvertEnquiryController</apexClass>
        <enabled>false</enabled>
    </classAccesses>
    <classAccesses>
        <apexClass>APAC_CreateSpaceAssController</apexClass>
        <enabled>false</enabled>
    </classAccesses>
</NameSet>

我想匹配此块

<classAccesses>
    <apexClass>APAC_CampaignLogicUtilitiesTestClass</apexClass>
    <enabled>false</enabled>
</classAccesses>

因此它操纵了xml doc。通过sed并删除此块。目前我可以这样做,

find . -name *.xml | xargs sed -ri 's/<.*?>APAC_CampaignLogicUtilitiesTestClass<.*?>//g'

但这只删除了一行

<apexClass>APAC_CampaignLogicUtilitiesTestClass</apexClass>

而不是块。正则表达式匹配整个块并在我的sed命令中使用什么?

1 个答案:

答案 0 :(得分:3)

不要使用正则表达式来解析XML。使用XML解析器。 是一个:修复xml之后,你可以做到

xmlstarlet ed -d '//_:classAccesses[_:apexClass = "APAC_CampaignLogicUtilitiesTestClass"]' file.xml 
相关问题