将参数值添加到XML中的现有标记

时间:2014-12-24 13:26:02

标签: xml shell awk sed

我正在尝试不同的方法将新值添加到我的XML文件中的现有标记。

我原来的XML:

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443"/>
  </Service>
</Server>

我希望它转变为:

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443"
      scheme="https"
      secure="true" SSLEnabled="true"
      keyAlias="tomcat" keyPass="welcome"
      keystoreFile="/data/matrix/automated-setup/openam.jks"
      keystorePass="welcome" clientAuth="false" sslProtocol="TLS"/>
  </Service>
</Server>

我不想在这里使用XSLT。我怎么能用sed或awk做到这一点? 它必须仅在标记下添加

2 个答案:

答案 0 :(得分:2)

像这样的sed脚本可以正常工作

sed  '
/^[ ]*<Connector port=.*protocol=.*/,/[ ]*<\/Service>/ {
\#.*"/>$# {
s#\(.*"\)/>#\1\n      scheme="https"\n      keyAlias="tomcat" keyPass="welcome"\n      keystoreFile="/data/matrix/automated-setup/openam.jks"\n      keystorePass="welcome" clientAuth="false" sslProtocol="TLS"/>#g 
}
}' $1

在其中使用后面的文件名称调用脚本。

如果您想更改以下信息

  scheme="https"
  secure="true" SSLEnabled="true"
  keyAlias="tomcat" keyPass="welcome"
  keystoreFile="/data/matrix/automated-setup/openam.jks"
  keystorePass="welcome" clientAuth="false" sslProtocol="TLS"/>

对脚本的这一部分进行操作

\n      scheme="https"\n      keyAlias="tomcat" keyPass="welcome"\n      keystoreFile="/data/matrix/automated-setup/openam.jks"\n      keystorePass="welcome" clientAuth="false" sslProtocol="TLS"/>#g

此脚本提供的结果

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443"
      scheme="https"
      keyAlias="tomcat" keyPass="welcome"
      keystoreFile="/data/matrix/automated-setup/openam.jks"
      keystorePass="welcome" clientAuth="false" sslProtocol="TLS"/>
  </Service>
</Server>

答案 1 :(得分:1)

如果你真的想用sed或awk来做,一种方法是

awk '{ print }
 /<Connector / {
   print "      scheme=\"https\""
   print "      secure=\"true\""
   print "      SSLEnabled=\"true\""
   print "      keyAlias=\"tomcat\" keyPass=\"welcome\""
   print "      keystoreFile=\"/data/matrix/automated-setup/openam.jks\""
   print "      keystorePass=\"welcome\" clientAuth=\"false\" sslProtocol=\"TLS\""
 }' foo.xml

这会直接在包含<Connector的行下插入参数。 然而,这种做法非常脆弱。如果XML文件包含例如一行

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

(即,如果标签在同一行中关闭),则会产生意外结果。有办法解决个别问题,但是处理sed或awk中所有可能出错的案例将会很困难,部分原因是你必须首先弄清楚所有案例是什么。想象一下,如果你不得不期待所有的

,那会是怎样的
<Connector/>
<Connector />
<Connector><someothertag/></Connector>
<ConnectorProperties foo="bar"/>

......老实说,你必须期待它们。我强烈建议您使用旨在处理XML而非原始文本的工具。在我看来,用sed或awk修改XML文件是蛮干的。