salida openoffice instalar guardar desde consola comando archivo abrir abre linux sed terminal

linux - openoffice - Agregar una línea a un archivo solo si aún no existe



libreoffice terminal linux (8)

Necesito agregar la siguiente línea al final de un archivo de configuración:

include "/configs/projectname.conf"

a un archivo llamado lighttpd.conf

Estoy buscando usar sed para hacer esto, pero no sé cómo.

¿Cómo podría insertarlo solo si la línea no existe?


Aquí hay una versión sed :

sed -e ''/|include "/configs/projectname.conf"|h; ${x;s/incl//;{g;t};a/' -e ''include "/configs/projectname.conf"'' -e ''}'' file

Si su cadena está en una variable:

string=''include "/configs/projectname.conf"'' sed -e "/|$string|h; /${x;s|$string||;{g;t};a//" -e "$string" -e "}" file


Esta sería una solución limpia, legible y reutilizable que usa grep y echo para agregar una línea a un archivo solo si aún no existe:

LINE=''include "/configs/projectname.conf"'' FILE=lighttpd.conf grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE"


Necesitaba editar un archivo con permisos de escritura restringidos, así que necesitaba sudo . trabajando desde la respuesta de ghostdog74 y usando un archivo temporal:

awk ''FNR==NR && /configs.*projectname/.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} '' file > /tmp/file sudo mv /tmp/file file


Otra solución sed es agregarla siempre en la última línea y eliminar una existente.

sed -e ''$a/' -e ''<your-entry>'' -e "/<your-entry-properly-escaped>/d"

"escapado correctamente" significa poner una expresión regular que coincida con su entrada, es decir, para escapar de todos los controles regex de su entrada actual, es decir, para poner una barra invertida delante de ^ $ / *? + ().

esto podría fallar en la última línea de tu archivo o si no hay una nueva línea enredada, no estoy seguro, pero eso podría ser tratado por alguna ramificación ingeniosa ...


Si escribe en un archivo protegido, las respuestas de @drAlberT y @ rubo77 podrían no funcionar para usted, ya que uno no puede sudo >> . Una solución igualmente simple , entonces, sería usar tee --append :

LINE=''include "/configs/projectname.conf"'' FILE=lighttpd.conf grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee --append "$FILE"


Si, un día, alguien más tiene que lidiar con este código como "código heredado" (también conocido como lo que f # * k es eso?!? ), Entonces esa persona le agradecerá que escriba un código menos exotérico, como

grep -q -F ''include "/configs/projectname.conf"'' lighttpd.conf if [ $? -ne 0 ]; then echo ''include "/configs/projectname.conf"'' >> lighttpd.conf fi


Simplemente mantenlo simple :)

grep + echo debería ser suficiente:

grep -q -F ''include "/configs/projectname.conf"'' foo.bar || echo ''include "/configs/projectname.conf"'' >> foo.bar

Editar: sugerencia incorporada @Cerin .

NOTA : para que los "editores" cambien mi respuesta: si tiene una solución alternativa ¡dé su propia respuesta! ¡La edición está pensada para aclarar, formatear, mejorar el inglés, etc.! ¡No cambies la respuesta dada por otros! (gracias)


usar awk

awk ''FNR==NR && /configs.*projectname/.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} '' file file