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 sedpara hacer esto, pero no puedo entender cómo.
¿Cómo lo insertaría solo si la línea aún no existe?

crudinipodría ser una buena opción (pero aún no para lighthttpd)Respuestas:
Solo mantenlo simple :)
grep + echo debería ser suficiente:
-qsilencio-xcoincidir con toda la línea-Fpatrón es una cadena simpleEditar: incorporaron @cerin y @ thijs-wouters sugerencias .
fuente
grep -vq ...echopara activar uncatheredoc multilínea en un archivo de configuración.-spara ignorar errores cuando el archivo no exista, creando un nuevo archivo solo con esa línea.Esta sería una solución limpia, legible y reutilizable usando
grepyechopara agregar una línea a un archivo solo si aún no existe:Si necesita unir toda la línea, use
grep -xqFAgregue
-spara ignorar errores cuando el archivo no exista, creando un nuevo archivo solo con esa línea.fuente
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"-.--en el comando grep, por lo que no interpretará un $ línea de salida con un guión como opciones más.Aquí hay una
sedversión:Si su cadena está en una variable:
fuente
sed -i -e '\|session.*pam_mkhomedir.so|h; ${x;s/mkhomedir//;{g;tF};a\' -e 'session\trequired\tpam_mkhomedir.so umask=0022' -e '};:F;s/.*mkhomedir.*/session\trequired\tpam_mkhomedir.so umask=0022/g;' /etc/pam.d/common-sessionseddurante años, pero principalmente solo elscomando. Los intercambiosholdy elpatternespacio están más allá de mí.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 similarmente simple , entonces, sería usartee --append(o, en MacOS,tee -a):fuente
Si, algún día, alguien más tiene que lidiar con este código como "código heredado", entonces esa persona se lo agradecerá si escribe un código menos exotérico, como
fuente
otra solución sed es agregarla siempre en la última línea y eliminar una preexistente.
"escapado correctamente" significa poner una expresión regular que coincida con su entrada, es decir, escapar de todos los controles de expresión regular de su entrada real, es decir, poner una barra diagonal inversa delante de ^ $ / *? + ().
esto podría fallar en la última línea de su archivo o si no hay una nueva línea colgante, no estoy seguro, pero eso podría solucionarse mediante una ingeniosa ramificación ...
fuente
sed -i.bak -e '$a\' -e "$NEW_IP\t\t$HOST.domain\t$HOST" -e "/.*$HOST/d" /etc/hostssed -i -e '/<entry>/d; $a <entry>'dcomando reiniciará el programa sed y, por lo tanto, omitirá elappend, si la eliminación se encuentra en la última línea.append tiene que ser ejecutado antes dedelete:sed -i -e '$a<entry>' -e '/<entry>/d'. Es casi lo mismo que su respuesta original.usar awk
fuente
file fileporque hace dos pases sobre el mismo archivo.NR==FNRes cierto en el primer pase, pero no en el segundo. Este es un idioma awk común.Las respuestas con grep son incorrectas. Debe agregar una opción -x para que coincida con la línea completa; de lo contrario, las líneas similares
#text to addseguirán coincidiendo cuando busque agregar exactamentetext to add.Entonces la solución correcta es algo como:
fuente
Usando sed: se insertará al final de la línea. También puede pasar variables como siempre, por supuesto.
Usando oneliner sed
Usar echo puede no funcionar bajo root, pero funcionará así. Pero no le permitirá automatizar las cosas si está buscando hacerlo, ya que podría solicitar una contraseña.
Tuve un problema cuando intentaba editar desde la raíz para un usuario en particular. Solo agregar el
$usernameantes fue una solución para mí.fuente
Necesitaba editar un archivo con permisos de escritura restringidos tan necesarios
sudo. trabajando desde la respuesta de ghostdog74 y usando un archivo temporal:fuente