如何使用sed删除给定行号的所有其他行?

时间:2014-03-27 20:03:44

标签: sed

我想删除文件中的每个其他行,从给定的行号开始到另一个给定的行号。我的文件中间有标题行,页脚行和数据行。我想只操纵数据线而不触及页眉和页脚线。我该怎么做呢?

示例foo.txt

header1
header2
header3
1
2
3
4
5
footer1
footer2
footer3

使用

sed '4~2d' -i foo.txt 

删除相应的数据行,但也从页脚中删除行

header1
header2
header3
2
4
footer1
footer3

我想要的是

header1
header2
header3
2
4
footer1
footer2
footer3

提前致谢

编辑:在我的实际文件中,不显示“标题”“页脚”等字样。我在这里使用它们来说明我的问题。在可以使用的实际标题行和页脚行中没有容易识别的单词。我唯一的信息是行的起始和结束编号

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -n '4,8!{p;b};n;p' file

或:

sed '4,8{N;s/.*\n//}' file 

或:

sed '4,8{4~2d}' file

答案 1 :(得分:0)

如果你知道线的数量,你可以这样做:

$ awk -v header=3 -v footer=9 'NR<=header || NR%2 || NR>=footer' file
header1
header2
header3
2
4
footer1
footer2
footer3

由于NR指的是行数,只需要使用您提供的数字。或者您也可以对它们进行硬编码:

$ awk 'NR<=3 || NR%2 || NR>=9' file

您可以在数字后重新打印行。在这种情况下,我们会从10打印回12

$ sed -e '4~2d; 10,12p' file
header1
header2
header3
2
4
footer1
footer3
footer3

如果awk被录取:

$ awk '/header/ || /footer/ || NR%2' file
header1
header2
header3
2
4
footer1
footer2
footer3

如果其中任何一个完成,则计算结果为true(因此打印行):

  • 行包含&#34;标题&#34;
  • 行包含&#34;页脚&#34;
  • 行数为2k+1

或更短(thanks Jotne!)

awk '/header|footer/ || NR%2' file

答案 2 :(得分:0)

如果您不能使用正则表达式识别页眉和页脚,假设您在最后3行和前3页的页脚上有标题,那么这是使用awk的另一种方式(如果然后不要适当修改以下代码):

$ awk '{ 
    line[NR] = $0 
}
END {
    while(x<3) print line[++x]; 
    for(x=4; x<=(NR-3); x++)
        if(x%2) print line[x]
    x=NR-3
    while(x<NR) print line[++x]
}' file