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
shell
text-processing
io-redirection
La leyenda
fuente
fuente
( echo "line 1" ; echo "line 2" ) >>greetings.txt
.{ echo "line 1" ; echo "line 2"; } >>greetings.txt
cat <<EOT
laEOT
es sólo una cadena aleatoria.cat <<FOO
También podría serlo .O, si lo que desea es una pestaña literal (en lugar de los cuatro espacios en su pregunta):
Puede lograr el mismo efecto con
echo
, pero exactamente cómo varía de implementación en implementación, mientras queprintf
es constante.fuente
fuente
Otro enfoque es usar
tee
Algunas líneas de elección de
tee
la página man de:fuente
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,a
le 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.
===================================
fuente
sed
. BSDsed
rescata 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 GNUsed
.find
los siguientes:find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
.>
,>>
) y, por lo tanto, no sufre sus problemas, como la ejecuciónsudo 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
.echo "a new line" >> foo.file
no va a crear una nueva línea cuando el archivo no es el fin de la nueva línea, perosed -i '$ a a new line' foo.file
lo hará, por lo quesed
es mejor, especialmente uno siempre quiere añadir una nueva línea en el fichero.Solía sed porque se puede usar con sudo. Por ejemplo:
la alternativa es muy fea como:
e incluso más feo cuando se hace con ssh.
fuente
sed -i
No tomas una extensión como argumento? Su ejemplo puede tener parámetros incorrectos.Otro delineador es:
Prefiero la
-e
opción pensada, ya que da más control:fuente
Se puede emular
cat >> out.txt
con Perl o Python para lograr el mismo efecto. Perl:Y Python:
Tenga en cuenta que para python deberá presionar Ctrl+ Ddos veces. Consulte la pregunta relacionada sobre stackoverflow para obtener más información.
fuente
Aquí hay un ejemplo para agregar varias líneas en un archivo:
fuente
Además de la principal respuesta, en caso de que el archivo necesita permisos de superusuario, simplemente añadiendo
sudo
frenteecho
no va a funcionar.Esto se debe a que Shell rompe los comandos y, aunque se
echo
ejecutó como root, pero se>>
ejecutó con privilegios normales.Esto funcionará para superusuario:
sudo su -c "echo 'Line 3' >> greetings.txt"
fuente
su
aquí (sudo su
no 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.