修改配对的节点名字

您指出了一个重要问题。之前的脚本只修改了开始标签,没有处理结束标签。让我提供一个完整的解决方案,同时修改开始标签和结束标签:

#!/bin/bash

# 定义要添加的前缀
PREFIX="New_"

# 使用 xmlstarlet 工具处理 XML 文件
for xmlfile in *.xml; do
    # 创建临时文件
    tempfile=$(mktemp)
    
    # 处理 XML 文件 - 同时修改开始和结束标签
    xmlstarlet ed \
        -r "//*[@type='instance']" -v "${PREFIX}name()" \
        "$xmlfile" > "$tempfile"
    
    # 用处理后的文件替换原文件
    mv "$tempfile" "$xmlfile"
    
    echo "已处理: $xmlfile"
done

完整解决方案说明

修复的问题

  1. 同时处理开始和结束标签

    • 使用 xmlstarlet-r(重命名)命令会同时修改开始标签和结束标签
    • 不需要单独处理结束标签
  2. 保留 XML 结构完整性

    • 确保修改后的 XML 仍然是有效的
    • 保留所有属性、内容和嵌套关系

安装依赖

如果尚未安装 xmlstarlet

# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y xmlstarlet

# CentOS/RHEL
sudo yum install -y xmlstarlet

# macOS (使用 Homebrew)
brew install xmlstarlet

示例演示

输入 XML (input.xml):

<root>
    <element type="instance">内容1element>
    <element type="other">不应修改element>
    <container type="instance">
        <child>子元素child>
    container>
    <anotherElement type="instance">内容2anotherElement>
root>

运行脚本:

./prefix_nodes.sh

输出 XML:

<root>
    <New_element type="instance">内容1New_element>
    <element type="other">不应修改element>
    <New_container type="instance">
        <child>子元素child>
    New_container>
    <New_anotherElement type="instance">内容2New_anotherElement>
root>

备选方案(无 xmlstarlet)

如果无法安装 xmlstarlet,可以使用这个增强的 sed 方案:

#!/bin/bash

# 定义要添加的前缀
PREFIX="New_"

for xmlfile in *.xml; do
    # 创建临时文件
    tempfile=$(mktemp)
    
    # 处理开始标签
    sed -E "s/(<)([a-zA-Z0-9_]+)([^>]* type=['\"]instance['\"][^>]*>)/\1${PREFIX}\2\3/g" \
        "$xmlfile" | \
    # 处理结束标签
    sed -E "s/(<\/)([a-zA-Z0-9_]+)([^>]* type=['\"]instance['\"][^>]*>)/\1${PREFIX}\2\3/g" | \
    # 处理简单结束标签(无属性)
    sed -E "s/(<\/)([a-zA-Z0-9_]+)(>)([^<]*<\/[a-zA-Z0-9_]+>)?/\1${PREFIX}\2\3\4/g" \
        > "$tempfile"
    
    # 检查处理后的文件是否有结束标签缺失
    if grep -q "${PREFIX}[^>]*>" "$tempfile"; then
        mv "$tempfile" "$xmlfile"
        echo "已处理: $xmlfile"
    else
        echo "警告: $xmlfile 可能未正确处理结束标签,已跳过"
        rm "$tempfile"
    fi
done

注意事项

  1. XML 复杂性

    • xmlstarlet 方案适用于任意复杂的 XML 文件
    • sed 方案适用于简单的单行标签
    • 对于多行标签或复杂结构,推荐使用 xmlstarlet
  2. 备份建议

    # 在处理前备份原始文件
    for xmlfile in *.xml; do
        cp "$xmlfile" "${xmlfile}.bak"
    done
    
  3. 测试验证

    # 验证处理后的 XML 是否有效
    xmllint --noout *.xml
    
  4. 自定义前缀

    • 修改脚本开头的 PREFIX 变量设置所需的前缀
    • 例如:PREFIX="Modified_"

这个修正后的脚本会确保同时修改开始标签和结束标签,保持 XML 文档的完整性。对于生产环境,强烈推荐使用基于 xmlstarlet 的方案,因为它能正确处理各种 XML 结构。

你可能感兴趣的:(shell)