统计文件匹配模式间行数,超4则删除模式间所有行
按行数阈值处理start/end标记间内容
问题场景
输入文件内容如下:
------start--------- first line second line third line fourth line ------end----------- xyx pqr ------start--------- first line second line third line fourth line fith line sixth line ------end-----------
需求:统计------start---------与------end-----------之间的行数,若行数超过4则删除块内所有内容,仅保留两个标记;若行数≤4则保留原块内容。期望输出:
------start--------- first line second line third line fourth line ------end----------- xyx pqr ------start--------- ------end-----------
现有sed -i '/start/,/end/{//!d}' filename命令只能直接删除标记间内容,无法根据行数阈值判断,需要更灵活的处理方案。
解决方案:使用awk实现
awk可以轻松统计标记间行数并执行条件判断,命令如下:
awk '/------start---------/{ print; flag=1; count=0; saved=""; next } flag && /------end-----------/{ flag=0; if(count<=4) { printf "%s", saved } print; next } flag{ count++; saved = saved $0 "\n"; next } 1' filename > output.txt
命令说明
- 匹配到
start标记时:打印该标记,开启标记位flag,初始化行数计数器count和内容缓存saved,跳过后续逻辑。 - 标记位开启且匹配到
end标记时:关闭标记位,若计数器≤4则打印缓存的内容,最后打印end标记。 - 标记位开启且未到
end时:计数器加1,将当前行存入缓存,跳过后续逻辑。 - 末尾的
1表示打印所有未被前面逻辑处理的行(即标记块外的内容)。
如果需要直接修改原文件,可执行:
awk '...' filename > temp.txt && mv temp.txt filename
内容的提问来源于stack exchange,提问作者Tushar Patil
相关产品推荐
相关产品推荐

