2009-06-03 80 views
22

您可以指定一系列要在其上操作的行。例如,在所有线路上使用,(这是当然的默认设置):sed线范围,除了最后一行

sed -e "1,$ s/a/b/" 

但我需要在所有但最后一行运行。你显然不能用算术表达式:

sed -e "1,$-1 s/a/b/" 

(我用的cygwin在这种情况下,如果有差别)

回答

41
sed -e "$ ! s/a/b/" 

这将匹配除最后一行以外的每一行。通过快速测试证实!

1

嗯,你可以有这样的本事:

sed -e "1,$(($(cat the-file | wc -l) - 1))s/a/b/" 

或者,你可以使用tail代替:

(tail +1 the-file) | sed -e s/a/b/; tail -1 the-file 
10

此命令的作用,也

sed '$d' 
+2

如果他想要打印出最后一行呢? – potong 2011-12-26 02:23:26

-1

在更普遍的意义上说,这个问题需要你指定一个范围,以编辑流与范围限制一个是从最终的文件偏移。以下示例显示如何执行此操作。在这个例子中,我打印出文件的所有行,从最后一行的第5行开始,到最后一行结束。在你的情况下,你可以设置OFFSET = -1而不是OFFSET = -5

((OFFSET = -5)); ((N1 = $(cat pgen.c | wc -l) + OFFSET)); sed -n "$N1,\$p" thefile 

该命令可以输入一行。

+0

亚历杭德罗,这个答案应该被删除,介绍性的文字移动到你的替换答案。 – 2014-05-22 01:34:43

3

我知道这是不是sed,但我觉得head得到最简单,最灵活的方式:

head -n -1 the-file 

使用-2,-3 ...而不是-1,检索所有,但最后两行等。