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
newvalue
se 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
sed
enfoque más simple , ya que no me resultased
hold space
fá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
sed
comandos 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
grep
yecho
para crear un registro vacío:Cada línea se escapa con el código de error cero.
fuente
grep
yecho
Realmente funciona con lo siguiente:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
En la respuesta elegida -i falta.fuente
para hacer esto con perl y en el lugar, esto funciona bien para mí:
fuente
grep
yecho
y enperl
lugar de hacer todoperl
? Además, ¿escribir en un archivo (>> my.file
) mientras lees (grep my.file
)?