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