echo "abc" >>file.txt
pone una nueva línea después abc
, no antes. Si termina abc
en su propia línea, eso significa que la nueva línea anterior abc
ya estaba presente en file.txt
.
Tenga en cuenta que es perfectamente normal que un archivo de texto termine en una nueva línea. En Unix, una línea consta de una secuencia de caracteres distintos de nulo⁰ o nueva línea seguida de una nueva línea. 1 Por lo tanto, cualquier archivo de texto no vacío termina con un carácter de nueva línea.
Si desea agregar texto a la última línea de un archivo, no puede hacerlo >>
, ya que esto siempre se agrega al archivo, por lo que siempre escribe después de la última línea nueva. En cambio, necesita una herramienta que sea capaz de modificar un archivo existente. Por ejemplo, puede usar sed :
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
En el comando sed, el primero $
significa "hacer el siguiente comando solo en la última línea", el comando s/REGEX/REPLACEMENT/
reemplaza REGEX por REPLACEMENT, y la expresión regular $
coincide al final de la línea.
El comando sed de Linux tiene una característica incorporada para automatizar esta secuencia de crear-nuevo-archivo-y-reemplazar, para que pueda acortar eso a
sed -i '$ s/$/abc/' file.txt
⁰ Eso es un byte nulo, que ASCII llama NUL y Unicode llama U + 0000. Los programas de procesamiento de texto pueden o no hacer frente a este personaje.
1 Consulte las definiciones de archivo de texto , línea y carácter de nueva línea en la sección "Definiciones" del capítulo Definiciones básicas de IEEE 1003.1-2008: 2016.