如何用SED替换XML中指定pool下<jdbcurl>标签的内容?
如何使用SED替换嵌套在特定id的标签下的内容
我有一个XML文件,想要替换<jdbcurl>标签内的文本值,但该标签分别嵌套在id为DEFAULT和bi_id的两个<pool>标签下。请问如何使用SED工具实现这一需求?
附XML内容:
<?xml version="1.0" ?> <WEBServer fileName="webdb.xml" name="Configuration and Security File"> <security> <pool id="DEFAULT" jndiName="jdbc/webdb"> <dbschema></dbschema> <userID>DBUSER</userID> <password>passwd1</password> <jdbcdriver>oracle.jdbc.driver.OracleDriver</jdbcdriver> <jdbcurl>jdbc:oracle:thin:@db.server.com:1753/ORCSN</jdbcurl> </pool> <pool id="bi_id" jndiName="jdbc/bidb"> <dbschema></dbschema> <userID>BIUSER</userID> <password>passwd2</password> <jdbcdriver>oracle.jdbc.driver.OracleDriver</jdbcdriver> <jdbcurl>jdbc:oracle:thin:@db.server.com:1753/ORCSN</jdbcurl> </pool> </security> </WEBServer>
刚好碰到过类似的场景,用SED处理这种结构简单的XML完全可行,分两种常见需求给你方案:
场景1:把两个<pool>下的<jdbcurl>替换成同一个新地址
如果你的需求是统一更新两个pool的数据库地址,比如都改成jdbc:oracle:thin:@new.db.server:1521/NEWDB,可以用这条SED命令:
sed -i '/<pool id="DEFAULT"/,/<\/pool>/ s/<jdbcurl>.*<\/jdbcurl>/<jdbcurl>jdbc:oracle:thin:@new.db.server:1521/NEWDB<\/jdbcurl>/; /<pool id="bi_id"/,/<\/pool>/ s/<jdbcurl>.*<\/jdbcurl>/<jdbcurl>jdbc:oracle:thin:@new.db.server:1521/NEWDB<\/jdbcurl>/;' your_file.xml
简单解释下命令逻辑:
/<pool id="DEFAULT"/,/<\/pool>/:锁定从id="DEFAULT"的<pool>标签开始,到对应的</pool>结束的整个代码块s/<jdbcurl>.*<\/jdbcurl>/.../:在这个锁定的区块里,把<jdbcurl>标签内的所有内容替换成你要的新URL- 分号分隔了两组规则,分别处理
DEFAULT和bi_id这两个pool区块
场景2:给两个<pool>分别设置不同的<jdbcurl>
如果需要给DEFAULT和bi_id设置不同的数据库地址(比如DEFAULT用业务库,bi_id用数仓地址),可以用这条更清晰的命令:
sed -i ' # 处理id为DEFAULT的pool /<pool id="DEFAULT"/,/<\/pool>/ s/<jdbcurl>.*<\/jdbcurl>/<jdbcurl>jdbc:oracle:thin:@default.db:1521/DEFAULT_DB<\/jdbcurl>/ # 处理id为bi_id的pool /<pool id="bi_id"/,/<\/pool>/ s/<jdbcurl>.*<\/jdbcurl>/<jdbcurl>jdbc:oracle:thin:@bi.db:1521/BI_DB<\/jdbcurl>/ ' your_file.xml
几个实用小提示
- 去掉
-i参数可以先测试效果:SED会把修改后的内容输出到终端,不会改动原文件,确认没问题再加-i直接修改 - 如果你的XML标签里有多余空格(比如
<jdbcurl >或者< jdbcurl>),可以把匹配规则改成<\s*jdbcurl\s*>来兼容这种情况 - 要注意:SED不是专门的XML处理工具,如果你的XML结构变得复杂(比如标签跨多行、嵌套层级多变),更推荐用
xmlstarlet这类专业工具,但对于你现在这种固定结构的XML,SED足够好用
内容的提问来源于stack exchange,提问作者meadlai
相关产品推荐
相关产品推荐

