在特定行范围内按模式删除行

时间:2015-09-24 12:03:25

标签: sed

我想使用sed的正则表达式从文件中删除行,就像在这个问题Delete lines in a text file that containing a specific string中一样,但只在一系列行内(不在整个文件中)。我想从一些行号开始直到文件结束。

这就是我与tail

结合使用的方式
  • tail -n +731 file|sed '/some_pattern/d' >> file
  • 从上一步
  • 中手动删除file中已编辑的范围

仅使用sed更短的方式吗?
sed -i '731,1000/some_pattern/d' file

这样的东西

4 个答案:

答案 0 :(得分:2)

您可以使用此sed

sed -i.bak '731,1000{/some_pattern/d}' yourfile

<强>测试

$ cat a
1
2
3
13
23
4
5

$ sed '2,4{/3/d}' a
1
2
23
4
5 

答案 1 :(得分:2)

您需要$地址才能匹配文件末尾。使用GNU sed:

sed -i '731,${/some_pattern/d;}' file

请注意,这可能比tail -n +number慢,因为sed将在文件开头处开始处理,而不是像tail那样执行lseek()

(使用BSD sed,您需要sed -i '' ...

答案 2 :(得分:0)

sed用于单个行上的简单替换,即全部。对于任何有趣甚至更有趣的东西,awk解决方案将更清晰,更强大,更便携,可维护,可扩展,并且几乎可以用于其他任何理想的软件属性。

鉴于此示例输入文件:

$ cat file
1
2
3
4
1
2
3
4
1
2
3
4

以下脚本将打印除输入文件第6行之后出现的包含数字3的行以外的每一行:

$ awk '!(NR>6 && /3/)' file
1
2
3
4
1
2
4
1
2
4

只想在第6行和第10行之间删除?没问题:

$ awk '!(NR>6 && NR<10 && /3/)' file
1
2
3
4
1
2
4
1
2
3
4

想要将跳过的行写入日志文件吗?没问题:

awk 'NR>6 && /3/{print > "log";next} {print}' file

写给stderr?

awk 'NR>6 && /3/{print | "cat>&2";next} {print}' file

想要计算你删除的行数还写入stderr吗?

awk 'NR>6 && /3/{print | "cat>&2"; cnt++; next} {print} END{print cnt | "cat>&2"}' file

你想要做的另外或不同的任何事情都很容易,并以你的开始为基础。尝试使用满足您原始要求的sed脚本,执行上述任何操作或其他任何操作。

答案 3 :(得分:0)

要求救援!

awk '!(NR>=731 && /pattern/)' input > output