很抱歉这个生硬的问题,需要一些关于如何在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命令中使用什么?
答案 0 :(得分:3)
不要使用正则表达式来解析XML。使用XML解析器。 xmlstarlet是一个:修复xml之后,你可以做到
xmlstarlet ed -d '//_:classAccesses[_:apexClass = "APAC_CampaignLogicUtilitiesTestClass"]' file.xml