You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用awk移除重复XML标记?优先采用sed实现

使用sed/awk替换跨两行的重复XML标记

sed解决方案(优先推荐)

sed可以通过跨行模式匹配实现需求,命令如下:

sed -E ':loop; N; s/^\s*(<[^&]+>)\s*\n\s*\1\s*/\<\/section>/; t loop' input.xml

命令解释:

  • -E:启用扩展正则,减少转义字符的使用
  • :loop:定义循环标签,用来处理多行连续重复的场景
  • N:读取下一行到当前模式空间,实现跨行内容的匹配
  • 替换规则s/^\s*(<[^&]+>)\s*\n\s*\1\s*/\<\/section>/:
    • ^\s*:匹配行首任意空白(包括空格、制表符)
    • (&lt;[^&]+&gt;):捕获一个完整的XML标签(比如<section>)
    • \s*\n\s*:匹配两行之间的任意空白+换行+任意空白,兼容不同缩进格式
    • \1:引用之前捕获的标签,确保是完全重复的内容
    • 替换为目标标签&lt;\/section&gt;(即</section>的HTML转义形式)
  • t loop:如果替换成功,跳回循环标签继续处理,避免遗漏多行连续重复的情况

awk备选方案

如果sed处理复杂场景有局限,可以用awk实现:

awk '
{
    line = $0
    gsub(/^\s+|\s+$/, "", line) # 去除当前行首尾空白
}
prev != "" {
    if (line == prev) { # 当前行处理后和上一行内容一致
        prev = ""
        next
    } else {
        print prev_line # 打印原格式的上一行
        prev = line
        prev_line = $0
    }
}
prev == "" {
    prev = line
    prev_line = $0
}
END {
    if (prev != "") {
        print "&lt;/section&gt;" # 输出最终目标标签
    }
}' input.xml

注意事项

  • 如果XML标签包含属性(比如<section id="1">),需要调整sed中的正则为&lt;section[^&]*&gt;,确保完整匹配带属性的标签
  • 测试时可以给sed加-n参数并在替换后加p(比如sed -E ':loop; N; s/.../.../p; t loop'),先预览替换结果再实际修改文件

内容的提问来源于stack exchange,提问作者mikey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:32:51