Con un solo archivo de entrada que solo contiene comentarios (comenzando con #) y VARIABLE = líneas de valor, ¿es posible reemplazar un valor para una sola variable si se encuentra y, de lo contrario, agregar el par al final del archivo si no se encuentra?
Mi método actual funciona eliminándolo en una primera pasada, luego anexándolo al final del archivo en una segunda pasada, pero este método desordena el orden de la línea (y también son dos comandos diferentes):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
¿Hay alguna forma de hacer esto, es decir. manteniendo el orden de las líneas, en una sola línea de sed? Si alguna otra utilidad (awk, ...) hace esto, lo tomaré sobre sed.
fuente

newvaluese almacena en una variable?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}con variables, comillas dobles para permitir la sustitución de variables y escapar de una$que no es una sustitución en este momento, adicionalmente si su valor está almacenado en$$varName:sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}Esto probablemente se puede acortar. No es un solo comando sed y también usa grep, pero esto parece ser básicamente lo que quieres. Es una sola línea y edita el archivo en el lugar (sin archivos temporales).
fuente
Aquí hay un
sedenfoque más simple , ya que no me resultasedhold spacefácil trabajar con él. Si se siente cómodohold space, el uso del enfoque don_crissti brinda una oportunidad adicional para preservar cualquier cosa de la línea existente, pero esto generalmente es muy raro.En este enfoque, solo imprime todo menos la línea que desea soltar y luego, al final, agrega el reemplazo.
fuente
Según las otras respuestas, si lo que desea hacer es reemplazar el valor de una variable si esa variable está presente en el archivo y agregarla al final del archivo si no lo está (que no es lo que hacen sus
sedcomandos publicados ), usted podría intentar esto:fuente
Es un poco más fácil en awk, aunque la "edición in situ" no es automática:
fuente
Simplemente use
grepyechopara crear un registro vacío:Cada línea se escapa con el código de error cero.
fuente
grepyechoRealmente funciona con lo siguiente:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infileEn la respuesta elegida -i falta.fuente
para hacer esto con perl y en el lugar, esto funciona bien para mí:
fuente
grepyechoy enperllugar de hacer todoperl? Además, ¿escribir en un archivo (>> my.file) mientras lees (grep my.file)?