2009-06-03 6 views
22

È possibile specificare un intervallo di linee su cui operare. Ad esempio, per operare su tutte le linee, (che naturalmente è l'impostazione predefinita):intervallo di linea sed, tutto tranne l'ultima riga

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

ma ho bisogno di operare su tutti, ma l'ultima riga. È a quanto pare non è possibile utilizzare le espressioni aritmetiche:

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

(sto usando cygwin in questo caso, se si fa la differenza)

risposta

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

Questo corrisponderà a ogni riga tranne l'ultima. Confermato con un test rapido!

1

Beh, si potrebbe incidere con qualcosa di simile:

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

Oppure, si potrebbe utilizzare tail invece:

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

Questo comando funziona anche

sed '$d' 
+2

E se vuole che venga stampata l'ultima riga? – potong

-1

In senso più generale, questo problema richiede di modificare un flusso specificando un intervallo con uno dei limiti del campo di essere un offset dal file end-of- . L'esempio seguente mostra come eseguire questa operazione. In questo esempio stampo tutte le righe di un file, iniziando dalla quinta riga dall'ultima riga e terminando con l'ultima riga. Nel tuo caso, puoi impostare OFFSET = -1 anziché OFFSET = -5.

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

Questo comando può essere inserito in una riga.

+0

Alejandro, questa risposta dovrebbe essere cancellata e il testo introduttivo spostato nella tua risposta di sostituzione. –

3

So che non è sed, ma sento che head ottiene il modo più semplice e più flessibile:

head -n -1 the-file 

Usa -2, -3 ... invece di -1, per recuperare tutti, ma il ultime due righe, ecc.