带有AND运算符的sed reg表达式不起作用,为什么不呢?

时间:2015-02-05 12:59:03

标签: regex sed xml-parsing

<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

1 个答案:

答案 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}}属性为NamePenguin-CL-Nest-s1),其值为Penguin-CL-Nest-s2