Oto seder jednoosobowy, który wykonuje pracę w linii. Zauważ, że zachowuje lokalizację zmiennej i jej wcięcie w pliku, jeśli istnieje. Jest to często ważne dla kontekstu, na przykład gdy pojawiają się komentarze lub gdy zmienna znajduje się w wciętym bloku. Każde rozwiązanie oparte na paradygmacie "usuń i dopisz" nie udaje się na tym źle.
sed -i '/^[ \t]*option=/{h;s/=.*/=value/};${x;/^$/{s//option=value/;H};x}' test.conf
Z ogólnej pary zmiennej/wartość można napisać to w następujący sposób:
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
Wreszcie, jeśli chcesz również zachować inline komentarze, można to zrobić z połowu Grupa. Na przykład. jeśli test.conf
zawiera następujące elementy:
a=123
# Here is "c":
c=999 # with its own comment and indent
b=234
d=567
Następnie uruchomiony ten
var='c'
val='"yay"'
sed -i '/^[ \t]*'"$var"'=/{h;s/=[^#]*\(.*\)/='"$val"'\1/;s/'"$val"'#/'"$val"' #/};${x;/^$/{s//'"$var"'='"$val"'/;H};x}' test.conf
Produkuje że:
a=123
# Here is "c":
c="yay" # with its own comment and indent
b=234
d=567
Bardzo łatwe i użyteczne! – JohnyTex