2009-06-03 12 views
22

Sie können eine Reihe von Zeilen angeben, auf denen Sie arbeiten möchten. Zum Beispiel auf allen Linien zu bedienen, (was den Standard natürlich ist):sed line range, alle außer der letzten Zeile

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

Aber ich muß auf alle, aber die letzte Zeile bedienen. Sie können offenbar nicht arithmetische Ausdrücke verwenden:

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

(Ich benutze Cygwin in diesem Fall, wenn es einen Unterschied macht)

Antwort

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

Dies entspricht jeder Zeile außer der letzten. Bestätigt mit einem Schnelltest!

1

Nun, könnte man es mit etwas so hacken:

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

Oder könnten Sie tail statt:

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

Dieser Befehl funktioniert auch

sed '$d' 
+2

Was ist, wenn er die letzte Zeile ausgedruckt haben möchte? – potong

-1

In einem allgemeineren Sinn, dieses Problem erfordert, dass Sie einen Stream bearbeiten, indem Sie einen Bereich mit einer der Bereichsgrenzen Angabe eines von dem End-of-Datei versetzt ist . Das folgende Beispiel zeigt, wie das gemacht wird. In diesem Beispiel drucke ich alle Zeilen einer Datei aus, beginnend mit der fünften Zeile der letzten Zeile und endend mit der letzten Zeile. In Ihrem Fall können Sie OFFSET = -1 anstelle von OFFSET = -5 einstellen.

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

Dieser Befehl kann in einer Zeile eingegeben werden.

+0

Alejandro, diese Antwort sollte gelöscht werden, und der einleitende Text wurde zu Ihrer Ersatzantwort verschoben. –

3

Ich weiß es nicht sed ist, aber ich fühle, dass head die einfachste und flexibelste Weg kommt:

head -n -1 the-file 

Verwenden -2, -3 ... statt -1, alle abzurufen, aber die die letzten zwei Zeilen usw.

Verwandte Themen