En realidad es bastante simple con sed
:si una línea coincide, simplemente cópiela en el h
espacio antiguo entonces s
sustituir el valor.
En la $
línea t ex
cambie el espacio de retención y el espacio del patrón y luego verifique si este último está vacío. Si no está vacío, significa que la sustitución ya se realizó, por lo que no hay nada que hacer. Si está vacío, eso significa que no se encontró ninguna coincidencia, así que reemplace el espacio del patrón con la variable=value deseada. luego agregue a la línea actual en el búfer de retención. Finalmente, ex
cambiar de nuevo:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Lo anterior es gnu sed
sintaxis. Portátil:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
Esto probablemente se puede acortar. No es un solo comando sed y también usa grep, pero esto parece ser básicamente lo que estás buscando. Es una sola línea y edita el archivo en el lugar (sin archivos temporales).
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
Aquí hay un sed
más simple enfoque, ya que no encuentro sed
hold space
fácil de trabajar. Si se siente cómodo con hold space
, el uso del enfoque don_crissti brinda una oportunidad adicional para preservar cualquier cosa de la línea existente, pero esto suele ser muy raro.
En este enfoque, simplemente imprime todo menos la línea que desea eliminar y luego, al final, agrega el reemplazo.
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile