Quiero agregar texto al archivo como echo "abc" >>file.txt
.
Pero esto agrega abc
después de una nueva línea
¿Cómo puedo agregar abc
al final del archivo con echo sin nueva línea?
shell
text-processing
io-redirection
echo
choijj
fuente
fuente
abc
sin una nueva línea final, que (después de leer atentamente su pregunta) no parece ser lo que desea.Respuestas:
echo "abc" >>file.txt
pone una nueva línea despuésabc
, no antes. Si terminaabc
en su propia línea, eso significa que la nueva línea anteriorabc
ya estaba presente enfile.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 :En el comando sed, el primero
$
significa "hacer el siguiente comando solo en la última línea", el comandos/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
⁰ 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.
fuente
0x41
(ASCII'A'
), ¿técnicamente ya no es un archivo de texto? Si es así, sugeriría enfatizar ese punto ya que es una definición poco intuitiva; de lo contrario, un ligero cambio en la redacción podría ayudar a evitar la confusión.No creo que sea posible con el
echo
comando, use el siguientesed
enfoque en su lugar:-i
- modificar el archivo en el lugar$
- indicar el último registro / líneas/$/abc/
- sustituya el final de la línea$
con subcadenaabc
(para el último registro)fuente
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
Suponiendo que el archivo no termina en una nueva línea y simplemente desea agregar más texto sin agregar uno, puede usar el
-n
argumento, por ejemploSin embargo, algunos sistemas UNIX no ofrecen esta opción; si ese es el caso, puede usar
printf
, por ejemplo(el
%s
argumento inicial es evitar el texto adicional que tiene%
caracteres de formato)Desde
man echo
(en macOS High Sierra):fuente
echo -n
no pondría una nueva línea al final deabc
, peroabc
aún estaría precedida por una nueva línea, que es lo que el usuario quiere evitar.\n
no apareciera en primer lugar. Más opciones son mejores, especialmente cuando no implican tener que reescribir todo el archivo cada vez que ocurre un cambio (que puede volverse bastante lento y ejecutarse en tiempo polinómico si se hace repetidamente).Si tiene el
truncate
comando y su archivo de texto tiene NL como último carácter, puede eliminarlo y luego agregar su texto de esta manera:(Tenga en cuenta que
truncate
no le importa nada el contenido del archivo, y en este ejemplo simplemente reduce el tamaño del archivo en un byte. Si su último carácter no es un solo byte, es decir, es un carácter "ancho" de varios bytes, entonces introducirá corrupción).fuente
Lo que desea es agregarlo al final de la última línea, justo antes del delimitador de esa última línea, justo antes del último carácter del archivo.
Con
ksh93
, puedes hacer:¿Dónde
1<>
está el operador estándar para abrir un archivo en modo lectura + escritura (y más importante sin truncamiento ) en stdout y>#((...))
es un operador de búsqueda específico de ksh93 (aquí para buscar antes del último byte)? Tenga en cuenta queecho
escribeabc<newline>
dondea
sobrescribe la nueva línea que estaba allí yecho
agrega su propia nueva línea.El
zsh
equivalente:Aunque para un equivalente más exacto, también necesitaría imprimir un mensaje de error en caso de no buscar:
fuente
Probablemente un UUOC pero también podrías hacer:
Como Gilles señala, este comando es limitado:
Además, tenga cuidado con
cat
el uso de archivos con los que no está familiarizado:conclusión :
Usa sed
fuente
echo
: pcat
con problemas de secuencias de escape arbitrarias que se envían al terminal.