我想删除文件中的每个其他行,从给定的行号开始到另一个给定的行号。我的文件中间有标题行,页脚行和数据行。我想只操纵数据线而不触及页眉和页脚线。我该怎么做呢?
示例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
提前致谢
编辑:在我的实际文件中,不显示“标题”“页脚”等字样。我在这里使用它们来说明我的问题。在可以使用的实际标题行和页脚行中没有容易识别的单词。我唯一的信息是行的起始和结束编号
答案 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(因此打印行):
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