2009-06-03 116 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,檢索所有,但最後兩行等。