Đây là một sed lót một lớp làm công việc nội tuyến. Lưu ý rằng nó giữ vị trí của biến và thụt đầu dòng trong tệp khi nó tồn tại. Điều này thường quan trọng đối với ngữ cảnh, như khi có các nhận xét xung quanh hoặc khi biến nằm trong một khối thụt lề. Bất kỳ giải pháp dựa trên mô hình "xóa-sau đó-chắp thêm" không thành công nghiêm trọng ở đây.
sed -i '/^[ \t]*option=/{h;s/=.*/=value/};${x;/^$/{s//option=value/;H};x}' test.conf
Với một cặp chung của biến/giá trị mà bạn có thể viết nó theo cách này:
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
Cuối cùng, nếu bạn cũng muốn giữ ý kiến nội tuyến, bạn có thể làm điều đó với một nắm bắt nhóm. Ví dụ. nếu test.conf
chứa sau:
a=123
# Here is "c":
c=999 # with its own comment and indent
b=234
d=567
Sau đó chạy này
var='c'
val='"yay"'
sed -i '/^[ \t]*'"$var"'=/{h;s/=[^#]*\(.*\)/='"$val"'\1/;s/'"$val"'#/'"$val"' #/};${x;/^$/{s//'"$var"'='"$val"'/;H};x}' test.conf
Tạo rằng:
a=123
# Here is "c":
c="yay" # with its own comment and indent
b=234
d=567
Rất dễ dàng và hữu ích! – JohnyTex