在 XML 节点名称前添加前缀
要查找 XML 文件中所有具有 type="instance"
属性的节点,并在其名称前添加前缀,可以使用以下 shell 脚本:
bash
#!/bin/bash
# 定义要添加的前缀
PREFIX="New_"
# 使用 xmlstarlet 工具处理 XML 文件
for xmlfile in *.xml; do
# 创建临时文件
tempfile=$(mktemp)
# 处理 XML 文件
xmlstarlet ed \
-r "//*[@type='instance']" -v "${PREFIX}concat(name())" \
"$xmlfile" > "$tempfile"
# 用处理后的文件替换原文件
mv "$tempfile" "$xmlfile"
echo "已处理: $xmlfile"
done
脚本说明
-
功能:
- 查找所有具有
type="instance"
属性的 XML 节点 - 在这些节点名称前添加指定的前缀(默认为 "New_")
- 保留原始 XML 结构和其他内容不变
- 查找所有具有
-
依赖:
- 需要安装
xmlstarlet
工具(XML 处理工具) - 安装方法:
sudo apt-get install xmlstarlet
(Debian/Ubuntu)或sudo yum install xmlstarlet
(CentOS/RHEL)
- 需要安装
-
使用方法:
- 将脚本保存为
prefix_nodes.sh
- 修改
PREFIX
变量设置所需的前缀 - 运行脚本:
./prefix_nodes.sh
- 将脚本保存为
示例
输入 XML
xml
<root>
<element type="instance">内容1</element>
<element type="other">不应修改</element>
<container type="instance">
<child>子元素</child>
</container>
<anotherElement type="instance">内容2</anotherElement>
</root>
输出 XML(使用前缀 "New_")
xml
<root>
<New_element type="instance">内容1</New_element>
<element type="other">不应修改</element>
<New_container type="instance">
<child>子元素</child>
</New_container>
<New_anotherElement type="instance">内容2</New_anotherElement>
</root>
备选方案(无 xmlstarlet 依赖)
如果无法安装 xmlstarlet
,可以使用这个基于 sed
的解决方案(适用于简单 XML 文件):
bash
#!/bin/bash
# 定义要添加的前缀
PREFIX="New_"
for xmlfile in *.xml; do
# 创建临时文件
tempfile=$(mktemp)
# 使用 sed 处理 XML
sed -E "s/(<)([a-zA-Z0-9_]+)([^>]* type=['\"]instance['\"][^>]*>)/\1${PREFIX}\2\3/g" \
"$xmlfile" > "$tempfile"
# 用处理后的文件替换原文件
mv "$tempfile" "$xmlfile"
echo "已处理: $xmlfile"
done
注意
sed
方案对 XML 格式更敏感,适用于简单情况- 对于复杂 XML(多行标签、注释等),建议使用
xmlstarlet
方案 - 在运行前建议备份原始 XML 文件
安装 xmlstarlet
如果系统中没有安装 xmlstarlet,可以使用以下命令安装:
Debian/Ubuntu:
bash
sudo apt-get update
sudo apt-get install xmlstarlet
CentOS/RHEL:
bash
sudo yum install xmlstarlet
macOS (使用 Homebrew):
bash
brew install xmlstarlet
这个脚本会安全地处理 XML 文件,确保只修改具有 type="instance"
属性的节点名称,同时保持 XML 文档的结构完整性。