Azure构建管道Bash脚本:用sed插入XML内容到指定位置
在Azure构建管道Bash脚本中插入XML内容到指定位置
问题说明
现有两个XML文件:
file1.xml内容
<loginIpRanges> <description>undefined</description> <endAddress>1.2.3.4</endAddress> <startAddress>1.2.3.0</startAddress> </loginIpRanges>
file2.xml内容
<?xml version="1.0" encoding="UTF-8"?> <Profile xmlns="http://soap.sforce.com/2006/04/metadata"> <applicationVisibilities> <application>standard__S</application> <default>false</default> <visible>false</visible> </applicationVisibilities> <custom>true</custom> <userPermissions> <enabled>true</enabled> <name>ViewRoles</name> </userPermissions> </Profile>
需求:将file1.xml的全部内容插入到file2.xml中<custom>true</custom>标签之后、<userPermissions>标签之前,得到目标XML结构。
可行解决方案
方法1:使用sed命令(简洁高效)
利用sed的r命令在匹配行后插入外部文件内容,适配Azure管道的Ubuntu环境(GNU sed):
# 匹配指定行并插入file1内容,生成备份后清理 sed -i.bak '/^\s*<custom>true<\/custom>\s*$/r file1.xml' file2.xml && rm file2.xml.bak
/^\s*<custom>true<\/custom>\s*$/:精确匹配带任意前后空格的目标行,避免误匹配r file1.xml:在匹配行后插入file1.xml的全部内容-i.bak:直接修改原文件并生成备份,执行后删除备份文件
方法2:使用awk命令(适配复杂XML结构)
如果XML格式有变动,awk逻辑更稳定,确保插入位置准确:
# 遍历file2,匹配到目标行时插入file1内容,替换原文件 awk ' {print} /<custom>true<\/custom>/ { while ((getline line < "file1.xml") > 0) { print line } close("file1.xml") } ' file2.xml > temp.xml && mv temp.xml file2.xml
- 逻辑说明:逐行打印
file2.xml内容,匹配到目标行时读取并打印file1.xml的所有内容,完成后继续处理后续行 - 通过临时文件替换原文件,实现修改
最终效果
执行任一命令后,file2.xml将变为:
<?xml version="1.0" encoding="UTF-8"?> <Profile xmlns="http://soap.sforce.com/2006/04/metadata"> <applicationVisibilities> <application>standard__S</application> <default>false</default> <visible>false</visible> </applicationVisibilities> <custom>true</custom> <loginIpRanges> <description>undefined</description> <endAddress>1.2.3.4</endAddress> <startAddress>1.2.3.0</startAddress> </loginIpRanges> <userPermissions> <enabled>true</enabled> <name>ViewRoles</name> </userPermissions> </Profile>
内容的提问来源于stack exchange,提问作者Sambit Swain
相关产品推荐
相关产品推荐

