Ecco un one-liner sed che fa il lavoro in linea. Si noti che conserva la posizione della variabile e la sua indentazione nel file quando esiste. Questo è spesso importante per il contesto, come quando ci sono commenti in giro o quando la variabile si trova in un blocco rientrato. Qualsiasi soluzione basata sul paradigma "delete-then-append" fallisce in questo modo.
sed -i '/^[ \t]*option=/{h;s/=.*/=value/};${x;/^$/{s//option=value/;H};x}' test.conf
Con un paio generico di variabile/valore che si può scrivere in questo modo:
var=c
val='12 34' # it handles spaces nicely btw
sed -i '/^[ \t]*'"$var"'=/{h;s/=.*/='"$val"'/};${x;/^$/{s//c='"$val"'/;H};x}' test.conf
Infine, se anche voi volete mantenere commenti in linea, è possibile farlo con un fermo gruppo. Per esempio. se test.conf
contiene:
a=123
# Here is "c":
c=999 # with its own comment and indent
b=234
d=567
Poi eseguire questo
var='c'
val='"yay"'
sed -i '/^[ \t]*'"$var"'=/{h;s/=[^#]*\(.*\)/='"$val"'\1/;s/'"$val"'#/'"$val"' #/};${x;/^$/{s//'"$var"'='"$val"'/;H};x}' test.conf
Produce che:
a=123
# Here is "c":
c="yay" # with its own comment and indent
b=234
d=567
Molto facile e utile! – JohnyTex