如何用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
相关产品推荐
相关产品推荐

