【问题标题】:Shell: Adding property in XML element if the attribute is not presentShell:如果属性不存在,则在 XML 元素中添加属性
【发布时间】:2018-09-12 17:15:24
【问题描述】:

如果该属性不存在,我想编写一个 Chef Recipe 以将一个属性添加到我的 XML 属性中,如果该属性存在则设置该值。

xml_file:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="false" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

如果 SSLEnabled 键不存在,我想为每个连接器标记添加一个新属性 SSLEnabled="true"。如果属性已经存在,则将值更新为“true”。

我可以考虑使用 shell 命令(最好是 grep/sed/awk)吗?

如果不是,哪种资源适合此用例?

P.S:我的连接器 XML 标记可以跨越多行或单行。

【问题讨论】:

  • 您不应该更喜欢基于正则表达式的工具来处理 XML。
  • 我们不建议在 Chef 中对配置文件使用这种部分更新工作流。最好让整个文件由template 资源或类似资源控制,因为这样可以确保系统始终收敛。

标签: xml shell chef-infra chef-recipe


【解决方案1】:

使用

xmlstarlet ed --insert '//Connector[not(@SSLEnabled)]' \
              --type attr --name 'SSLEnabled' --value "true" \
           file.xml

要将输出保存到同一个文件中,请在ed 子命令之后添加--inplace 选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多