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 puedo entender cómo.
¿Cómo lo insertaría solo si la línea aún no existe?
crudini
podría ser una buena opción (pero aún no para lighthttpd)Respuestas:
Solo mantenlo simple :)
grep + echo debería ser suficiente:
-q
silencio-x
coincidir con toda la línea-F
patrón es una cadena simpleEditar: incorporaron @cerin y @ thijs-wouters sugerencias .
fuente
grep -vq ...
echo
para activar uncat
heredoc multilínea en un archivo de configuración.-s
para 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
grep
yecho
para agregar una línea a un archivo solo si aún no existe:Si necesita unir toda la línea, use
grep -xqF
Agregue
-s
para 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
sed
versió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-session
sed
durante años, pero principalmente solo els
comando. Los intercambioshold
y elpattern
espacio 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/hosts
sed -i -e '/<entry>/d; $a <entry>'
d
comando reiniciará el programa sed y, por lo tanto, omitirá ela
ppend, si la eliminación se encuentra en la última línea.a
ppend tiene que ser ejecutado antes ded
elete:sed -i -e '$a<entry>' -e '/<entry>/d'
. Es casi lo mismo que su respuesta original.usar awk
fuente
file file
porque hace dos pases sobre el mismo archivo.NR==FNR
es 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 add
seguirá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
$username
antes 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