37

您可以指定要操作的行范围。例如,要对所有行进行操作,(这当然是默认设置):

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

但我需要对除最后一行之外的所有内容进行操作。您显然不能使用算术表达式:

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

(在这种情况下,我使用的是 cygwin,如果有区别的话)

4

5 回答 5

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

这将匹配除最后一行之外的每一行。通过快速测试确认!

于 2009-06-03T21:51:36.297 回答
18

该命令也有效

sed '$d'
于 2010-07-29T13:07:14.443 回答
2

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

head -n -1 the-file

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

于 2016-08-08T12:40:04.747 回答
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
于 2009-06-03T21:47:30.003 回答
-1

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

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

该命令可以在一行中输入。

于 2014-05-21T16:56:02.983 回答