PowerShell批量给XML书籍添加库名失败,求解决方法
Bash下给XML中每个添加节点的解决方案
前提准备
先安装Linux下可靠的XML处理工具xmlstarlet,避免用正则处理XML带来的格式破坏风险:
- Debian/Ubuntu系:
sudo apt install xmlstarlet - RHEL/CentOS系:
sudo yum install xmlstarlet
批量处理脚本
生成修改后的新文件(推荐,避免误改原文件)
# 遍历所有library*.xml文件 for file in library*.xml; do # 提取文件名前缀(自动去掉.xml后缀) library_name="${file%.xml}" # 给每个<book>元素添加<library>子节点,内容为对应库名 xmlstarlet edit \ --insert "//book" \ --type elem \ -n library \ -v "$library_name" \ "$file" > "${file%.xml}_modified.xml" done
直接修改原文件(谨慎使用,建议先备份)
如果确认无需保留原文件,可使用--inplace参数直接修改:
for file in library*.xml; do library_name="${file%.xml}" xmlstarlet edit --inplace \ --insert "//book" \ --type elem \ -n library \ -v "$library_name" \ "$file" done
关键部分说明
${file%.xml}:Bash参数扩展语法,自动截断文件名的.xml后缀,比如library2.xml会转为library2xmlstarlet edit核心参数:--insert "//book":精准定位所有<book>元素,在其内部插入新节点(默认作为最后一个子节点)--type elem:声明插入的是XML元素节点-n library:指定新节点的名称为library-v "$library_name":设置新节点的文本内容为提取的库名
为什么不用sed/awk?
XML是结构化文档,元素可能跨多行、包含属性或不规则缩进,正则表达式无法可靠识别XML的层级结构,极易破坏文件格式。xmlstarlet是专门的XML处理工具,能保证操作的准确性。
内容的提问来源于stack exchange,提问作者jj95
相关产品推荐
相关产品推荐

