¿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.

Dchris
fuente

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.

Jon Kiparsky
fuente
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

Cyclonecode
fuente
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
usuario9869932
fuente
¿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
user12345
fuente
¡He estado usando cat << 'EOF' >durante años y no sabía cómo cat << 'EOF' >>agregar! Gracias
FreeSoftwareServers