无ID属性时,如何通过xmlstarlet按顺序修改XML中Connector端口
使用xmlstarlet按顺序修改无ID的端口
当然可以按顺序定位/Connector[1]大概率找不到元素,因为这些
先明确你的XML结构(参考你给出的片段)
你的三个
return (<Server ...> <Service ...> <Connector connectionTimeout="20000" port="9000" protocol="HTTP/1.1" redirectPort="8443" server=" "/> )<Connector port="8029" protocol="AJP/1.3" redirectPort="8443"/> <Connector address="127.0.0.1" connectionTimeout="20000" port="9002" protocol="HTTP/1.1" server=""/>
按顺序修改的具体命令
1. 修改第一个的端口为9500
用//Connector[1]匹配任意层级下的第一个/Server/Service/Connector[1]会更严谨):
xmlstarlet ed --inplace -u "//Connector[1]/@port" -v 9500 server.xml
2. 修改第二个(AJP协议)的端口为8030
xmlstarlet ed --inplace -u "//Connector[2]/@port" -v 8030 server.xml
3. 修改第三个的端口为9003
xmlstarlet ed --inplace -u "//Connector[3]/@port" -v 9003 server.xml
一次性批量修改多个
如果想一次搞定所有修改,可以用多个-u参数:
xmlstarlet ed --inplace \ -u "//Connector[1]/@port" -v 9500 \ -u "//Connector[2]/@port" -v 8030 \ -u "//Connector[3]/@port" -v 9003 \ server.xml
额外建议:按属性定位更稳妥
虽然按顺序定位简单,但如果以后XML里的protocol属性来定位,比如:
- 修改第一个HTTP/1.1的端口:
xmlstarlet ed --inplace -u "//Connector[@protocol='HTTP/1.1'][1]/@port" -v 9500 server.xml
- 修改AJP协议的端口:
xmlstarlet ed --inplace -u "//Connector[@protocol='AJP/1.3']/@port" -v 8030 server.xml
这样即使元素顺序变动,也能精准定位到目标
内容的提问来源于stack exchange,提问作者Burton
相关产品推荐
相关产品推荐

