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

如何用grep或sed移除XML中每对<display-name>的第一行

删除XML中每对<display-name>的第一行,保留第二行

需要处理XML文件,删除每个<channel>节点下的第一行<display-name>标签,仅保留第二行。

原文件内容

<?xml version="1.0" encoding="UTF-8"?>
<tv guide2go="guide2go" source-info-name="Schedules Direct" source-info-url="http://schedulesdirect.org">
  <channel id="guide2go.68589.schedulesdirect.org">
    <display-name>COMCUKH</display-name>
    <display-name>Comedy Central UK HD</display-name>
    <icon src="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68589_dark_360w_270h.png" height="270" width="360"></icon>
  </channel>
  <channel id="guide2go.79036.schedulesdirect.org">
    <display-name>INVDIP1</display-name>
    <display-name>ID +1</display-name>
    <icon src="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s79036_dark_360w_270h.png" height="270" width="360"></icon>
  </channel>

期望处理结果

<?xml version="1.0" encoding="UTF-8"?>
<tv guide2go="guide2go" source-info-name="Schedules Direct" source-info-url="http://schedulesdirect.org">
  <channel id="guide2go.68589.schedulesdirect.org">
    <display-name>Comedy Central UK HD</display-name>
    <icon src="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68589_dark_360w_270h.png" height="270" width="360"></icon>
  </channel>
  <channel id="guide2go.79036.schedulesdirect.org">
    <display-name>ID +1</display-name>
    <icon src="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s79036_dark_360w_270h.png" height="270" width="360"></icon>
  </channel>

可行命令方案

方案1:Sed跨行处理命令

Sed通过N命令将下一行读入模式空间,实现跨行匹配删除:

# 生成新文件
sed -e '/<display-name>/{N;s/.*<display-name>.*\n//}' input.xml > output.xml

# 直接修改原文件(谨慎操作)
sed -i -e '/<display-name>/{N;s/.*<display-name>.*\n//}' input.xml

命令说明:

  • /<display-name>/:匹配到含<display-name>的行时执行后续块操作
  • N:将下一行内容追加到当前模式空间(两行合并)
  • s/.*<display-name>.*\n//:删除模式空间中的第一行内容,仅保留第二行的<display-name>标签

方案2:Awk计数过滤命令

通过计数器识别每对<display-name>的第二行并保留:

# 生成新文件
awk '/<display-name>/{cnt++; if(cnt%2==0) print; next} {cnt=0; print}' input.xml > output.xml

命令说明:

  • 遇到<display-name>行时,计数器cnt自增
  • 仅当cnt为偶数(即第二行)时打印该行
  • 遇到非<display-name>行时,重置计数器并正常打印该行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:36:00