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 wc
y varios otros trucos).
Actualmente, utilizando una solución alternativa head
y tail
combinada con wc
para hacerlo. ¿Algún giro rápido aquí?
text-processing
sed
mtk
fuente
fuente
head
ytail
...head
ytail
conocer diferentes sabores?Respuestas:
in sed
$
es la última línea, así que para eliminar la última línea:fuente
sed -i '$d' <file>
para editar el archivo en su lugar.$ para la última línea:
fuente
sed '$d' file; sed '$d' file
sed '$d' file
realidad no modifica el archivo; solo imprime el contenido del archivo, menos la última línea. Entoncessed '$d' file; sed '$d' file
imprimirá el contenido del archivo dos veces , menos la última línea cada vez. El equivalente de eliminar las últimas dos líneas desed '$d' file
essed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Estaba haciendo un puchero que no podemos hacersed '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Tenga cuidado, al parecer, dependiendo de la última línea de
file.txt
(si termina conEOF
, o\n
y luegoEOF
), el número de líneasnew_file.txt
puede ser el mismo (quefile.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á.
fuente
head -n -1 file.txt > new_file.txt
. Sin embargo,head -n
tenga en cuenta que las cuentas negativas solo están disponibles para algunas implementaciones dehead
. Por ejemplo, no funciona para FreeBSD o para la versión de BusyBoxhead
.head -n -1 file.txt > new_file.txt
es 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.)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)tail
yhead
son parte decoreutils
-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.1No estoy seguro si RH5.5. ya tiene la versión coreutils que lo admite. Pero 5.5 tiene EoLed de todos modos.
fuente
Linux
$ es la última línea, d para eliminar:
Mac OS
Equivalente de sed -i
fuente