我有数以百计的XML文件包含以下字符串:使用使用grep RE和sed查找和bash shell中替换字符串
<METADATAEXTENSION COMPONENTVERSION ="8006001" DATATYPE ="STRING" DESCRIPTION ="Name of the Salesforce.com object" DOMAINNAME ="Salesforce" ISCLIENTEDITABLE ="NO" ISCLIENTVISIBLE ="YES" ISREUSABLE ="YES" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="255" NAME ="Object Type" VALUE ="MY_STRING_TO_FIND__TheRestOfTheString__c" VENDORNAME ="INFORMATICA"/>
我需要找到上面的字符串,找到
MY_STRING_TO_FIND
并将其替换为不同的值,例如
MY_STRING_TO_REPLACE
所以最终结果应该是这样的:
<METADATAEXTENSION COMPONENTVERSION ="8006001" DATATYPE ="STRING" DESCRIPTION ="Name of the Salesforce.com object" DOMAINNAME ="Salesforce" ISCLIENTEDITABLE ="NO" ISCLIENTVISIBLE ="YES" ISREUSABLE ="YES" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="255" NAME ="Object Type" VALUE ="MY_STRING_TO_REPLACE__TheRestOfTheString__c" VENDORNAME ="INFORMATICA"/>
我创建了两个变量:
MY_STRING_TO_FIND=AAA
MY_STRING_TO_REPLACE=BBB
,并使用下面的命令来查找包含整个字符串我需要找到,然后相应地更换令牌的所有文件:
grep -l "<METADATAEXTENSION[\s]*[$MY_STRING_TO_FIND]*" my_dir_with_xml_files | xargs sed -i "s/\A<METADATAEXTENSION[\s=\"._/>a-zA-Z0-9]+VALUE[\s=\"]+$MY_STRING_TO_FIND[__a-zA-Z\"\s=/>]+/\A<METADATAEXTENSION[\s=\"._/>a-zA-Z0-9]+VALUE[\s=\"]+$MY_STRING_TO_REPLACE[__a-zA-Z\"\s=/>]+/g"
但这是行不通的。
一个复杂因素是字符串$ MY_STRING_TO_FIND发生在每个xml文件的其他部分,我不能触及。所以我需要在sed表达式中找到特定的字符串,并仅在此字符串中进行替换。
我试过其他各种组合都无济于事......
我知道,双引号忽略RE但允许参数扩展和单引号把一切从字面上所以我不能扩大我的参数。所以我在这里输了一些关于如何处理我的情况。
本质上,我试图解决在Informatica中动态处理Salesforce名称空间名称的问题。
我很欣赏,如果你点我在正确的方向
非常感谢!
你不应该试图操纵与面向行的工具XML。改为使用'xmlstarlet'之类的东西。 –