bash - salto - Eliminar un carácter de nueva línea al final de un archivo
sed linux reemplazar (5)
Aproveche el hecho de que a) el carácter de nueva línea está al final del archivo yb) el carácter es de 1 byte: use el comando truncate
para reducir el tamaño del archivo en un byte:
# a file with the word "test" in it, with a newline at the end (5 characters total)
$ cat foo
test
# a hex dump of foo shows the ''/n'' at the end (0a)
$ xxd -p foo
746573740a
# and `stat` tells us the size of the file: 5 bytes (one for each character)
$ stat -c ''%s'' foo
5
# so we can use `truncate` to set the file size to 4 bytes instead
$ truncate -s 4 foo
# which will remove the newline at the end
$ xxd -p foo
74657374
$ cat foo
test$
También puede pasar el tamaño y las matemáticas en un comando de una línea:
truncate -s $(($(stat -c ''%s'' foo)-1)) foo
Para eliminar todas las nuevas líneas que puedas, di:
tr -d ''/n'' < days.txt
cat days.txt | tr -d ''/n''
pero ¿cómo usaría tr
para eliminar solo la nueva línea al final / al final de un archivo de texto?
No estoy seguro de especificar sólo el último.
Creo que tu mejor apuesta es Perl:
perl -0pe ''s//n/Z//'' days.txt
El -0
hace que perl trate todo el archivo como una gran cadena. La -p
le dice que vuelva a imprimir esa cadena después de ejecutar el programa en ella. Y el -e
dice "aquí está el programa para ejecutar".
La expresión regular /n/Z
coincide con una nueva línea, pero solo si es el último carácter de una cadena. Y s//n/Z//
dice que se reemplace esa nueva línea con nada en absoluto, eliminándola.
El comando anterior genera la nueva versión del archivo, pero puede modificar la existente agregando la opción -i
("en el lugar"), opcionalmente con un sufijo que se usará para nombrar una copia de respaldo del archivo antes modificándolo:
perl -i.bak -0pe ''s//n/Z//'' days.txt
Esta solución es segura porque si el último carácter no es una nueva línea, no se tocará. Las otras soluciones que simplemente eliminan el último byte sin importar lo que pueda corromper dicho archivo.
Pruebe este comando: sed ''$ { /^$/ d}'' days.txt
Puede leerlo como: "verifique si la última línea es una línea vacía. Si es así, elimine esta línea". Probé con ambos casos: primero con un archivo que tiene una nueva línea al final y otro tiempo con un archivo que termina con otra cosa.
Si está seguro de que el último carácter es una nueva línea, es muy simple:
head -c -1 days.txt
head -c -N
significa todo excepto los últimos N bytes
Una solución más sencilla que la aceptada:
truncate -s -1 <<file>>
Desde la página de manual truncada:
-s, --size=SIZE
set or adjust the file size by SIZE
SIZE may also be prefixed by one of the following modifying characters:
''+'' extend by, ''-'' reduce by, ''<'' at most, ''>'' at least, ''/'' round down
to multiple of, ''%'' round up to multiple of.