如何用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*:匹配行首任意空白(包括空格、制表符)(<[^&]+>):捕获一个完整的XML标签(比如<section>)\s*\n\s*:匹配两行之间的任意空白+换行+任意空白,兼容不同缩进格式\1:引用之前捕获的标签,确保是完全重复的内容- 替换为目标标签
<\/section>(即</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 "</section>" # 输出最终目标标签 } }' input.xml
注意事项
- 如果XML标签包含属性(比如
<section id="1">),需要调整sed中的正则为<section[^&]*>,确保完整匹配带属性的标签 - 测试时可以给sed加
-n参数并在替换后加p(比如sed -E ':loop; N; s/.../.../p; t loop'),先预览替换结果再实际修改文件
内容的提问来源于stack exchange,提问作者mikey
相关产品推荐
相关产品推荐

