我正在尝试不同的方法将新值添加到我的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做到这一点? 它必须仅在标记下添加
答案 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文件是蛮干的。