如何用Bash删除XML文件中指定的<types>代码块?
可行的Bash解决方案
针对你的需求,这里提供几种可靠的方法来删除指定的<types>代码块:
方法1:使用awk(跨平台兼容,无需额外安装)
awk处理多行文本的能力更稳定,适合这种场景:
awk ' /<types>/{block=""; in_block=1} in_block{block=block $0 "\n"} /<\/types>/{ in_block=0 if (block !~ /CustomObjectTranslation/) print block } !in_block ' package.xml > cleaned_package.xml
说明:
- 检测到
<types>时,开始收集整个代码块的内容 - 遇到
</types>时,判断块内是否包含CustomObjectTranslation,不包含则输出该块 - 非代码块的内容直接输出
- 结果会保存到
cleaned_package.xml,可替换为你需要的文件名
方法2:使用sed(适合GNU/Linux环境)
如果你的环境是GNU sed(大部分Linux发行版默认),可以用多行匹配命令:
sed -e '/<types>/{:a;N;/<\/types>/!ba;/CustomObjectTranslation/d}' package.xml > cleaned_package.xml
说明:
/<types>/定位到代码块起始行:a;N;/<\/types>/!ba循环读取所有行直到</types>,将整个块放入模式空间- 如果模式空间包含
CustomObjectTranslation,则删除整个块 - macOS默认的BSD sed需调整语法:
sed -e '/<types>/{:a;N;/<\/types>/!ba;/CustomObjectTranslation/d;}' package.xml
方法3:使用XML专用工具(最可靠,推荐)
正则处理XML存在结构变化时失效的风险,用专门的XML工具更稳妥,比如xmlstarlet:
- 先安装工具:
- Ubuntu/Debian:
sudo apt install xmlstarlet - macOS:
brew install xmlstarlet
- Ubuntu/Debian:
- 执行删除命令:
xmlstarlet ed -d '/Package/types[name="CustomObjectTranslation"]' package.xml > cleaned_package.xml
说明:
- 该命令直接解析XML结构,定位到
Package下name为CustomObjectTranslation的types节点并删除 - 完全避免了正则匹配的局限性,适合复杂XML场景
内容的提问来源于stack exchange,提问作者Antonio Italiano
相关产品推荐
相关产品推荐

