使用 xmlstarlet 更改 xml 属性
Change xml attributes with xmlstarlet
这是我的 xml 文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<data-sources>
<data-source id="mariaDB-162b8e6bd5d-176d08c17fde61cb" provider="mysql" driver="mariaDB" name="MariaDB - app" save-password="true" show-system-objects="true" read-only="false">
<connection host="172.23.0.4" port="3306" server="" database="portal" url="jdbc:mysql://172.23.0.4:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
<network-handler type="TUNNEL" id="ssh_tunnel" enabled="false" save-password="false">
<property name="sshConnectTimeout" value="10000"/>
<property name="port" value="22"/>
<property name="implementation" value="jsch"/>
<property name="authType" value="PASSWORD"/>
</network-handler>
<network-handler type="PROXY" id="socks_proxy" enabled="false" save-password="false">
<property name="socks-port" value="1080"/>
</network-handler>
<network-handler type="CONFIG" id="mysql_ssl" enabled="false" save-password="false">
<property name="ssl.public.key.retrieve" value="false"/>
<property name="ssl.verify.server" value="true"/>
<property name="ssl.require" value="false"/>
</network-handler>
</connection>
</data-source>
<filters/>
</data-sources>
例如我希望能够改变
<connection host="172.23.0.4" port="3306" server="" database="portal" url="jdbc:mysql://172.23.0.4:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
到
<connection host="172.28.0.8" port="3306" server="" database="portal" url="jdbc:mysql://172.28.0.8:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
所以我需要动态更改主机 属性 和 url。
我试过了:
xmlstarlet ed -u "/data-sources/data-source/connection[@host]/@host" -v '172.28.0.8' .dbeaver-data-sources.xml
但它不起作用,文件没有改变。
除了 --inplace
建议之外,更改多个属性必须通过多次调用来完成
declare -A host=([old]=172.23.0.4 [new]=172.23.0.8)
new_url="jdbc:mysql://${host[new]}:3306/portal"
xmlstarlet ed -u "//connection[@host = '${host[old]}']/@host" -v "${host[new]}" file.xml |
xmlstarlet ed -u "//connection[@host = '${host[new]}']/@url" -v "$new_url"
<?xml version="1.0" encoding="UTF-8"?>
<data-sources>
<data-source id="mariaDB-162b8e6bd5d-176d08c17fde61cb" provider="mysql" driver="mariaDB" name="MariaDB - app" save-password="true" show-system-objects="true" read-only="false">
<connection host="172.23.0.8" port="3306" server="" database="portal" url="jdbc:mysql://172.28.0.8:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
<network-handler type="TUNNEL" id="ssh_tunnel" enabled="false" save-password="false">
<property name="sshConnectTimeout" value="10000"/>
<property name="port" value="22"/>
<property name="implementation" value="jsch"/>
<property name="authType" value="PASSWORD"/>
</network-handler>
<network-handler type="PROXY" id="socks_proxy" enabled="false" save-password="false">
<property name="socks-port" value="1080"/>
</network-handler>
<network-handler type="CONFIG" id="mysql_ssl" enabled="false" save-password="false">
<property name="ssl.public.key.retrieve" value="false"/>
<property name="ssl.verify.server" value="true"/>
<property name="ssl.require" value="false"/>
</network-handler>
</connection>
</data-source>
<filters/>
</data-sources>
这是我的 xml 文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<data-sources>
<data-source id="mariaDB-162b8e6bd5d-176d08c17fde61cb" provider="mysql" driver="mariaDB" name="MariaDB - app" save-password="true" show-system-objects="true" read-only="false">
<connection host="172.23.0.4" port="3306" server="" database="portal" url="jdbc:mysql://172.23.0.4:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
<network-handler type="TUNNEL" id="ssh_tunnel" enabled="false" save-password="false">
<property name="sshConnectTimeout" value="10000"/>
<property name="port" value="22"/>
<property name="implementation" value="jsch"/>
<property name="authType" value="PASSWORD"/>
</network-handler>
<network-handler type="PROXY" id="socks_proxy" enabled="false" save-password="false">
<property name="socks-port" value="1080"/>
</network-handler>
<network-handler type="CONFIG" id="mysql_ssl" enabled="false" save-password="false">
<property name="ssl.public.key.retrieve" value="false"/>
<property name="ssl.verify.server" value="true"/>
<property name="ssl.require" value="false"/>
</network-handler>
</connection>
</data-source>
<filters/>
</data-sources>
例如我希望能够改变
<connection host="172.23.0.4" port="3306" server="" database="portal" url="jdbc:mysql://172.23.0.4:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
到
<connection host="172.28.0.8" port="3306" server="" database="portal" url="jdbc:mysql://172.28.0.8:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
所以我需要动态更改主机 属性 和 url。 我试过了:
xmlstarlet ed -u "/data-sources/data-source/connection[@host]/@host" -v '172.28.0.8' .dbeaver-data-sources.xml
但它不起作用,文件没有改变。
除了 --inplace
建议之外,更改多个属性必须通过多次调用来完成
declare -A host=([old]=172.23.0.4 [new]=172.23.0.8)
new_url="jdbc:mysql://${host[new]}:3306/portal"
xmlstarlet ed -u "//connection[@host = '${host[old]}']/@host" -v "${host[new]}" file.xml |
xmlstarlet ed -u "//connection[@host = '${host[new]}']/@url" -v "$new_url"
<?xml version="1.0" encoding="UTF-8"?>
<data-sources>
<data-source id="mariaDB-162b8e6bd5d-176d08c17fde61cb" provider="mysql" driver="mariaDB" name="MariaDB - app" save-password="true" show-system-objects="true" read-only="false">
<connection host="172.23.0.8" port="3306" server="" database="portal" url="jdbc:mysql://172.28.0.8:3306/portal" user="portal" password="fakepassword" home="/usr" type="dev">
<network-handler type="TUNNEL" id="ssh_tunnel" enabled="false" save-password="false">
<property name="sshConnectTimeout" value="10000"/>
<property name="port" value="22"/>
<property name="implementation" value="jsch"/>
<property name="authType" value="PASSWORD"/>
</network-handler>
<network-handler type="PROXY" id="socks_proxy" enabled="false" save-password="false">
<property name="socks-port" value="1080"/>
</network-handler>
<network-handler type="CONFIG" id="mysql_ssl" enabled="false" save-password="false">
<property name="ssl.public.key.retrieve" value="false"/>
<property name="ssl.verify.server" value="true"/>
<property name="ssl.require" value="false"/>
</network-handler>
</connection>
</data-source>
<filters/>
</data-sources>