Eliminar la última línea del archivo

44

Utilizo sed para eliminar rápidamente líneas con una posición específica como

sed '1d'
sed '5d'

Pero, ¿qué pasa si quiero eliminar la última línea del archivo y no sé el recuento de líneas (sé que puedo obtener eso usando wcy varios otros trucos).

Actualmente, utilizando una solución alternativa heady tailcombinada con wcpara hacerlo. ¿Algún giro rápido aquí?

mtk
fuente
Cual os? Algunos sabores tienen opciones interesantes para heady tail...
Nils
@Nils Estoy en 'Red Hat Enterprise Linux Server versión 5.5 (Tikanga)'. ¿Puede señalar las opciones heady tailconocer diferentes sabores?
mtk
Yo si. Vea abajo.
Nils

Respuestas:

88

in sed $es la última línea, así que para eliminar la última línea:

sed '$d' <file>
h3rrmiller
fuente
12
Use sed -i '$d' <file>para editar el archivo en su lugar.
WanderingMind
1
¿Cuál sería para eliminar las últimas n líneas, donde n es cualquier número entero?
Joshua Salazar
31

$ para la última línea:

sed '$d' file
Gurú
fuente
10
te ganó por 30 segundos: P
h3rrmiller
1
Lamentablemente, aunque uno tiene que usar técnicas más complejas para eliminar, por ejemplo, las dos últimas líneas.
dubiousjim
¿Qué quieres decir? sed '$d' file; sed '$d' file
Rob
3
@Rob: en sed '$d' filerealidad no modifica el archivo; solo imprime el contenido del archivo, menos la última línea. Entonces sed '$d' file; sed '$d' fileimprimirá el contenido del archivo dos veces , menos la última línea cada vez. El equivalente de eliminar las últimas dos líneas de sed '$d' filees sed '$d' file | sed '$d'.
ruakh
2
Sí, eso no es elegante pero, por supuesto, funciona. Lo haría de una pasada con sed -n '1{h;n;}; $q; x; p;'. Estaba haciendo un puchero que no podemos hacer sed '$-1,$d'.
dubiousjim
14

cat file.txt | head -n -1 > new_file.txt

Tenga cuidado, al parecer, dependiendo de la última línea de file.txt(si termina con EOF, o \ny luego EOF), el número de líneas new_file.txtpuede ser el mismo (que file.txt) después de este comando (esto sucede cuando no hay \n); en cualquier caso, Se elimina el contenido de la última línea.

Además, tenga en cuenta que debe usar un segundo archivo (intermedio). Si captura y redirige al mismo archivo, lo borrará.

Emanuel Berg
fuente
66
Donde esto funciona, también podría ser simple head -n -1 file.txt > new_file.txt. Sin embargo, head -ntenga en cuenta que las cuentas negativas solo están disponibles para algunas implementaciones de head. Por ejemplo, no funciona para FreeBSD o para la versión de BusyBox head.
dubiousjim
1
@dubiousjim: De acuerdo, head -n -1 file.txt > new_file.txtes mejor. Funciona de la misma manera con respecto a mis dos comentarios (mismo número de líneas y borrar en el mismo archivo). En cuanto al argumento negativo, tales diferencias ocurren de vez en cuando entre Unixes, y a menudo son frustrantes porque esperas que sea el mismo comando por completo (¡y por qué no lo harías - mismo nombre y propósito!) - de todos modos, bueno punto. (Uso Debian.)
Emanuel Berg
5

head --lines=-1. Primero me topé con esta posibilidad en la página de manual para head en un sistema SLES11SP2 (coreutils-8.12-6.23.1)

taily headson parte de coreutils-rpm (al menos para sistemas basados ​​en rpm).

Según el registro de cambios de coreutils, esta sintaxis es compatible desde coreutils-versión 5.0.1

Malas noticias: según la página de manual de RH5, esta opción no se describe

Buenas noticias: funciona con RH5 (por lo que en su caso: funciona, al menos con una versión actual de RH5).

rpm -q coreutils me muestra (en CentOS 5.8): coreutils-5.97-34.el5_8.1

No estoy seguro si RH5.5. ya tiene la versión coreutils que lo admite. Pero 5.5 tiene EoLed de todos modos.

Nils
fuente
+1. funciona perfectamente en RH5.5. Gracias.
mtk
0

Linux

$ es la última línea, d para eliminar:

sed '$d' ~/path/to/your/file/name

Mac OS

Equivalente de sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
jasonleonhard
fuente