2009-06-03 15 views
22

Możesz określić zakres linii do działania. Na przykład, aby działać na wszystkich liniach, (co jest oczywiście ustawienie domyślne):Zasięg linii sed, wszystkie poza ostatnią linią

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

Ale muszę działać na wszystkich, ale w ostatnim wierszu. Ty najwyraźniej nie można używać wyrażeń arytmetycznych:

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

(używam cygwin w tym przypadku, jeśli to robi różnicę)

Odpowiedz

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

To dopasuje każdy wiersz, ale ostatni. Potwierdzony szybkim testem!

1

dobrze, można włamać się go mniej więcej tak:

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

Albo można użyć tail zamiast:

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

To polecenie działa też

sed '$d' 
+2

Co jeśli chce wydrukować ostatnią linię? – potong

-1

W bardziej ogólnym sensie, kwestia ta wymaga, aby edytować strumienia, określając zakres jedną z granic zakresu jest przesunięcie z pliku end-of- . Poniższy przykład pokazuje, jak to zrobić. W tym przykładzie drukuję wszystkie linie pliku, zaczynając od piątej linii od ostatniej linii, a kończąc na ostatniej linii. W twoim przypadku możesz ustawić OFFSET = -1 zamiast OFFSET = -5.

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

Ta komenda może być wprowadzona w jednym wierszu.

+0

Alejandro, ta odpowiedź powinna zostać usunięta, a tekst wprowadzający przeniesiony do odpowiedzi zastępczej. –

3

wiem, że to nie jest sed, ale czuję, że head dostaje najprostszy i najbardziej elastyczny sposób:

head -n -1 the-file 

Używaj -2, -3 ... zamiast -1, aby odzyskać wszystko, ale ostatnie dwie linie, itp.

Powiązane problemy