una salto reemplazar lineas linea eliminar comando caracteres caracter cadena bash scripting newline tr

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.