Déjame aclarar sobre el carácter de nueva línea:
$ echo Hello > file1 ; cat file1
Hello
$ echo -n Hello > file2 ; cat file2
Hello$
Aquí puede ver que file1
tiene un carácter de nueva línea al final, mientras que file2
no.
Ahora supongamos que tengo uno file
:
$ cat file
Hello
Welcome to
Unix
$
Y quiero agregar and Linux
al final del archivo, luego echo " and Linux" >> file
se agregará a la nueva línea. Pero quiero la última línea comoUnix and Linux
Entonces, para evitarlo, quiero eliminar el carácter de nueva línea al final del archivo. Por lo tanto, ¿cómo elimino el carácter de nueva línea al final del archivo?
sed '$s/$/ and linux/'
Respuestas:
Si todo lo que quiere hacer es agregar texto a la última línea, es muy fácil con sed. Reemplace
$
(coincidencia de patrón al final de la línea) por el texto que desea agregar, solo en las líneas del rango$
(lo que significa la última línea).que en Linux se puede acortar a
Si desea eliminar el último byte de un archivo, Linux (más precisamente GNU coreutils) ofrece el
truncate
comando, que lo hace muy fácil.Una forma POSIX de hacerlo es con
dd
. Primero determine la longitud del archivo, luego trúnquelo a un byte menos.Tenga en cuenta que ambos truncan incondicionalmente el último byte del archivo. Es posible que desee comprobar que es una nueva línea primero:
fuente
perl -pi -e 'chomp if eof' myfile
. Comparadotruncate
odd
no te dejará con un archivo roto si enmyfile
realidad no tiene líneas nuevas.Sin embargo, puede eliminar el carácter de nueva línea de la línea
tr -d '\n'
:Puede eliminar el carácter de nueva línea al final del archivo utilizando la siguiente manera fácil:
head -c -1 file
De
man head
:truncate -s -1 file
de
man truncate
:fuente
head -c -1 file | tee file
seguro? ¿Notee
truncaría el archivo antes de comenzar?tee
solo tiene que abrir el archivo, mientras quehead
tiene que leer y escribir su contenido,tee
en la práctica ganará la carrera, excepto en ocasiones para archivos muy pequeños.Puede lograr esto con perl como:
En comparación con
truncate
odd
esto no va a dejar con un archivo roto simyfile
tenía saltos de línea en realidad no se arrastran.(la respuesta se construye a partir del comentario y se basa en esta respuesta )
fuente
Aquí hay una manera con
sed
: en la última$
línea ( ) del archivo, busque y reemplace cualquier cosa y todo (.*
) con "lo que coincida" seguido de "y Linux":Una solución aún más simple, cortesía de Isaac , es:
Esto reemplaza el final de línea (simbólico) con el texto dado.
fuente