Cómo agregar varias líneas a un archivo

301

Estoy escribiendo un script bash para buscar un archivo si no existe, entonces créelo y añádelo:

Host localhost
    ForwardAgent yes

Entonces "line then new line 'tab' then text"creo que es un formato sensible. Sé que puedes hacerlo:

cat temp.txt >> data.txt

Pero parece extraño ya que son dos líneas. ¿Hay alguna manera de agregar eso en este formato?

echo "hello" >> greetings.txt
La leyenda
fuente

Respuestas:

526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Si se necesita sudo (otros privilegios de usuario) para escribir en el archivo, use esto:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT
Hauke ​​Laging
fuente
2
@TheLegend Eso se llama un "documento aquí". Echa un vistazo a ese párrafo en la página del manual.
Hauke ​​Laging
1
Una posibilidad más es ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--
2
@ ott-- No necesita una subshell real (es decir, puede guardar un nuevo proceso), esto es suficiente:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging
2
¿Cuál es la diferencia entre EOT y EOL?
cikatomo
15
@cikatomo En cat <<EOTla EOTes sólo una cadena aleatoria. cat <<FOOTambién podría serlo .
Hauke ​​Laging
60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

O, si lo que desea es una pestaña literal (en lugar de los cuatro espacios en su pregunta):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Puede lograr el mismo efecto con echo, pero exactamente cómo varía de implementación en implementación, mientras que printfes constante.

maldad
fuente
33
echo -e "Hello \nWorld \n" >> greetings.txt
kendotwill
fuente
16

Otro enfoque es usar tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

Algunas líneas de elección de teela página man de:

La utilidad tee copia la entrada estándar a la salida estándar, haciendo una copia en cero o más archivos.

-a: agrega la salida a los archivos en lugar de sobrescribirlos.


fuente
6

SED puede agregar una línea al final de un archivo de la siguiente manera:

sed -i '$ a text to be inserted' fileName.file
$selecciona el final del archivo, ale dice que agregue, y después de esto viene el texto que se va a insertar. Luego, por supuesto, el nombre del archivo.


Fuente: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

¿Este enfoque tiene algún beneficio adicional que otras soluciones?
Sí, este enfoque tiene el beneficio adicional de agregar a cualquier archivo devuelto en una búsqueda, como este: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

Utilicé el ejemplo anterior para insertar la etiqueta html final que faltaba en cada página html dentro de varios directorios.

===================================

OB7DEV
fuente
1
Si mostrara la sintaxis para agregar varias líneas a un archivo, esta sería una respuesta a la pregunta (aunque no muy útil). Todas las otras respuestas simplemente escriben el nuevo texto. Esta respuesta lee todo el archivo y lo reescribe, además del texto agregado. ¿Este enfoque tiene algún beneficio sobre los demás?
G-Man
Esto solo funciona con GNU sed. BSD sedrescata con el error: command a expects \ followed by text. Así que no use esto para una solución con script; Es probable que se rompa. (O hágalo correctamente ya que la sintaxis requerida de BSD es compatible con POSIX y funcionará también en GNU sed.
Comodín
Las otras respuestas se pueden utilizar con findlos siguientes: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man
1
Esta es una muy buena solución, ya que no realiza la redirección de flujo ( >, >>) y, por lo tanto, no sufre sus problemas, como la ejecución sudo echo 'something' > /file. Para mí es perfectamente permite añadir una línea a un archivo en un recipiente LXD así: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater
El echo "a new line" >> foo.fileno va a crear una nueva línea cuando el archivo no es el fin de la nueva línea, pero sed -i '$ a a new line' foo.filelo hará, por lo que sedes mejor, especialmente uno siempre quiere añadir una nueva línea en el fichero.
zhouji
1

Solía ​​sed porque se puede usar con sudo. Por ejemplo:

sudo sed -i '$ a text to be inserted' fileName.file 

la alternativa es muy fea como:

sudo bash -c "echo a text to be inserted >> fileName.file"  

e incluso más feo cuando se hace con ssh.

Fred Mehrdad
fuente
1
¿Por qué se rechazó esta respuesta? Esta parece la solución que necesito. ¿Hay algún problema con eso? Si no, lo usaré y lo votaré.
MountainX
¿ sed -iNo tomas una extensión como argumento? Su ejemplo puede tener parámetros incorrectos.
protometa
1

Otro delineador es:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Prefiero la -eopción pensada, ya que da más control:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt
Erdal G.
fuente
1

Se puede emular cat >> out.txtcon Perl o Python para lograr el mismo efecto. Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

Y Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Tenga en cuenta que para python deberá presionar Ctrl+ Ddos veces. Consulte la pregunta relacionada sobre stackoverflow para obtener más información.

Sergiy Kolodyazhnyy
fuente
1

Aquí hay un ejemplo para agregar varias líneas en un archivo:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt
usuario2753331
fuente
0

Además de la principal respuesta, en caso de que el archivo necesita permisos de superusuario, simplemente añadiendo sudofrente echono va a funcionar.

Esto se debe a que Shell rompe los comandos y, aunque se echoejecutó como root, pero se >>ejecutó con privilegios normales.

Esto funcionará para superusuario: sudo su -c "echo 'Line 3' >> greetings.txt"

SJ00
fuente
No necesitas el suaquí ( sudo suno es bueno). Pero tiene razón en que necesita algo para administrar la redirección de shell; quizá sudo sh -c "echo stuff >> file.txt". Sin ahorro neto pero una mejor práctica.
Roaima