【发布时间】:2017-05-14 02:23:47
【问题描述】:
我有数百个包含以下字符串的 xml 文件:
<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之类的东西。