¿Cómo agrego texto a un archivo?


109

¿Cuál es la forma más sencilla de agregar texto a un archivo en Linux?

Eché un vistazo a esta pregunta , pero la respuesta aceptada usa un programa adicional ( sed) Estoy seguro de que debería haber una forma más fácil con echoo similar.

Respuestas:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Básicamente, puede volcar cualquier texto que desee en el archivo. CTRL-D envía una señal de fin de archivo, que termina la entrada y lo regresa al shell.


2
¿Cómo puedo hacer esto cuando el archivo necesita permiso de root?
— UselesssCat

2
@UselesssCat cuando algo dice "permiso denegado", vuelvo a verificar cualquier comando que esté ejecutando y luego uso sudo !!, que ejecuta el último comando con el sudoprefijo. Recientemente descubrí que esto también funciona con nanoetc (al intentar accidentalmente nano nano auth...)
— Sandra

si necesita usar sudo o usar esto en un script, consulte mi seguimiento de esta respuesta aceptada a continuación.
— user12345

4
¡No sabía que el gato podía usarse así! Como escribir una entrada en un diario. Tampoco sabía qué hace ctrl-d. ¡Gracias!
— houallet

1
@Sandra - No lo usé !!antes, increíble. Muy a menudo hago cosas como cat /var/log/apache/error.logy me niegan el permiso. Esto también se puede hacer con una identificación del historial sudo !1419, por ejemplo , esto ejecutará el comando en la línea 1419del historial como sudo.
— Cyclonecode

172

Qué tal si:

echo "hello" >> <filename>

El uso del >>operador agregará datos al final del archivo, mientras que el uso de >sobrescribirá el contenido del archivo si ya existe.

También puedes usar printfde la misma manera:

printf "hello" >> <filename>

Tenga en cuenta que puede ser peligroso utilizar lo anterior. Por ejemplo, si ya tiene un archivo y necesita agregar datos al final del archivo y se olvida de agregar el último, >todos los datos del archivo serán destruidos. Puede cambiar este comportamiento configurando la noclobbervariable en su .bashrc:

set -o noclobber

Ahora, cuando intentes hacerlo echo "hello" > file.txt, recibirás una advertencia cannot overwrite existing file.

Para forzar la escritura en el archivo, ahora debe usar la sintaxis especial:

echo "hello" >| <filename>

También debe saber que, de forma predeterminada, echoagrega un carácter de nueva línea al final que se puede suprimir usando la -nbandera:

echo -n "hello" >> <filename>

Referencias


4
En general, me gusta esto más que la respuesta aceptada que usa cat, pero es mejor que tenga cuidado de asegurarse de usar en >>lugar de >!
— sixty4bit

@ sixty4bit - Totalmente de acuerdo, pero creo que siempre debes saber lo que estás haciendo cuando trabajas con un shell o de lo contrario podrías hacer algo como sudo rm -r /=)
— Cyclonecode

1
mejor sudo rm -r /que sudo rm -rf /! ^ _ ^ ¿Existe una bandera que solicite confirmación antes de sobrescribir el contenido de un archivo existente con >? Parece que sería una buena idea utilizar un alias para usar siempre dicha bandera.
— sixty4bit

2
@ sixty4bit - Puede agregar set -o noclobbersu, .bashrcentonces no puede sobrescribir un archivo existente sin usar la sintaxis especialecho "hello" >| <filename>
— Cyclonecode

¿Puede dar un ejemplo en el que se llame al archivo, digamos "myFile.txt" o algo así? No estoy seguro de si es <nombre de archivo> o nombre de archivo en su ejemplo
— bharal

24

Otra forma posible es:

echo "text" | tee -a filename >/dev/null

los -a agregará al final del archivo.

Si es necesario sudo, use:

echo "text" | sudo tee -a filename >/dev/null

¿Por qué el> / dev / null al final?
— Quadrivium

1
El >/dev/nullal final evita que se muestre "texto" en su consola.
— user9869932

13

Seguimiento de la respuesta aceptada.

Necesita algo diferente a CTRL-D para designar el final si lo usa en un script . Prueba esto en su lugar:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Esto agregará texto al archivo indicado (sin incluir "EOF").

Utiliza un documento here (o heredoc) .

Sin embargo, si necesita que sudo se agregue al archivo indicado, tendrá problemas para utilizar un heredoc debido a la redirección de E / S si está escribiendo directamente en la línea de comando.

Esta variación funcionará cuando escriba directamente en la línea de comando:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

O puede usar teeen su lugar para evitar el problema de sudo de línea de comando que se ve al usar heredoc con cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

¡He estado usando cat << 'EOF' >durante años y no sabía cómo cat << 'EOF' >>agregar! Gracias
— FreeSoftwareServers
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.