<ServerCluster CloneSeparatorChange="false" GetDWLMTable="false" IgnoreAffinityRequests="true" LoadBalance="Round Robin" Name="Penguin-CL-Nest-s1" ServerIOTimeoutRetry="-1">
我尝试做的是查找和替换,其中字符串匹配IgnoreAffinityRequests =&#34; true&#34; AND Penguin-CL-Nest-s1或s2,当匹配时,字符串true应替换为false。
enterIgnoreAffinityRequests="true"
Name="Penguin-CL-Nest-s1"
Name="Penguin-CL-Nest-s2"
以下是我在SLES11.3上使用的命令
sed -i -r -e '/IgnoreAffinityRequests="true"/{;/Name="Penguin-CL-Nest-\w\d"/s/IgnoreAffinityRequests="true"/IgnoreAffinityRequests="false"/;}' example1
它没有正则表达式,任何帮助感激不尽,谢谢。
sed -i -e '/IgnoreAffinityRequests="true"/{;/Name="Penguin-CL-Nest-s1"/s/IgnoreAffinityRequests="true"/IgnoreAffinityRequests="false"/;}' example1
答案 0 :(得分:2)
使用sed编辑XML不是一个好主意,因为在意外的地方或重新排序的属性中的空格 - 没有人使用XML预期会成为问题 - 可能会破坏您的脚本。 XML不是基于行的格式,sed是基于行的工具,因此两者不能很好地结合在一起。
相反,我建议您使用可以正确解析和编辑XML的工具,例如xmlstarlet
。在这种情况下:
xmlstarlet ed -u '//ServerCluster[(@Name="Penguin-CL-Nest-s1" or @Name="Penguin-CL-Nest-s2") and @IgnoreAffinityRequests="true"]/@IgnoreAffinityRequests' -v 'false'
这个关键部分是-u
之后的XPath,其中
//ServerCluster
是文档中任意位置的ServerCluster
节点,//ServerCluster[condition]/@IgnoreAffinityRequests
是文档中任何位置IgnoreAffinityRequests
的{{1}}属性,用于履行ServerCluster
和condition
节点的(@Name="Penguin-CL-Nest-s1" or @Name="Penguin-CL-Nest-s2") and @IgnoreAffinityRequests="true"
和Name
属性符合条件,则条件IgnoreAffinityRequests
为真。因此,ServerCluster
命令将更新与此匹配的所有实体(即xmlstarlet
IgnoreAffinityRequests
属性,其ServerClusterNodes
属性当前为true且其IgnoreAffinityRequests
属性1}}属性为Name
或Penguin-CL-Nest-s1
),其值为Penguin-CL-Nest-s2
。