2010-03-17 30 views

Trả lời

72

Một đâm hoang dã trong bóng tối cho sửa đổi một giá trị duy nhất:

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE 

giả định rằng chìa khóa mục tiêu và thay thế giá trị không chứa bất kỳ ký tự regex đặc biệt nào và dấu phân tách giá trị khóa của bạn là "=". Lưu ý, tùy chọn -c là hệ thống phụ thuộc và bạn có thể cần phải bỏ qua nó để sed thực thi.

Để biết các mẹo khác về cách thực hiện các thay thế tương tự (ví dụ: khi REPLACEMENT_VALUE có ký tự '/' trong đó), there are some great examples here.

+7

-c dường như không hợp lệ trong môi trường của tôi. Khi tôi thoát khỏi -c, nó hoạt động. Cảm ơn. –

+0

Tùy chọn '-c' cho sed sao chép tệp khi nó xáo trộn nó (thay vì đổi tên) - nó ngăn thay đổi quyền sở hữu và gây rối với các tệp chỉ đọc. Một trong những thói quen mà tôi đã chọn để tự cứu mình khỏi những sai lầm ngu ngốc (đặc biệt là với 'tìm ... | xargs sed -i'). – Cascabel

+1

Tôi thực sự nhận được hai downvotes cho câu trả lời này? Tôi không chỉ quản lý để đoán những gì OP muốn, nó ngắn và hiệu quả. Bất cứ ai quan tâm để giải thích? – Cascabel

-1

Giả sử tập tin cấu hình của bạn là ở dưới dạng:

CONFIG_NUM=4 
CONFIG_NUM2=5 
CONFIG_DEBUG=n 

Trong kịch bản bash, bạn có thể sử dụng:

CONFIG_FILE=your_config_file 
. $CONFIG_FILE 

if [ $CONFIG_DEBUG == "y" ]; then 
    ...... 
else 
    ...... 
fi 

$CONFIG_NUM, $CONFIG_NUM2, $CONFIG_DEBUG là những gì bạn cần.

Sau khi bạn đọc các giá trị, hãy viết nó trở lại sẽ dễ dàng:

echo "CONFIG_DEBUG=y" >> $CONFIG_FILE 
+6

Điều đó sẽ không thay thế các giá trị, chỉ cần thêm một lần nữa ở phía dưới, nó hoàn toàn phụ thuộc vào tập tin cấu hình là một tập lệnh bash hợp lệ và ... wow, nếu có điều gì đó độc hại trong tệp cấu hình thì sao? – Cascabel

1

nói chung thật dễ dàng để trích xuất các thông tin với grep và cắt:


cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER" 

để cập nhật bạn có thể làm một cái gì đó như thế này:


mv "$FILE" "$FILE.bak" 
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE" 
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE" 

này sẽ không duy trì trật tự của Key- các cặp giá trị hiển nhiên. thêm kiểm tra lỗi để đảm bảo bạn không bị mất dữ liệu của mình.

+0

nếu bạn hết dung lượng đĩa hoặc vì lý do nào đó bạn không thể tạo 'FILE' thì giải pháp của bạn sẽ để lại' FILE' bị thiếu (một người sẽ phải đổi tên thủ công 'FILE.bak' trở lại thành' FILE' để khôi phục.) – vladr

+0

bạn đặt cược đó là lý do tại sao tôi đã viết 'thêm kiểm tra lỗi' vv :) –

0

Giả sử rằng bạn có một tập tin của key=value cặp, có khả năng với không gian xung quanh =, bạn có thể xóa, sửa đổi tại chỗ hoặc thêm cặp khóa-giá trị tùy ý sử dụng awk ngay cả khi các phím hoặc giá trị chứa chuỗi regex đặc biệt:

# Using awk to delete, modify or append keys 
# In case of an error the original configuration file is left intact 
# Also leaves a timestamped backup copy (omit the cp -p if none is required) 
CONFIG_FILE=file.conf 
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" && 
awk -F '[ \t]*=[ \t]*' '$1=="keytodelete" { next } $1=="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" && 
mv "$CONFIG_FILE~" "$CONFIG_FILE" || 
echo "an error has occurred (permissions? disk space?)" 
2
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile 
10

Hope this helps một ai đó. Tôi tạo ra một kịch bản tự chứa, mà yêu cầu cấu hình xử lý các loại.

#!/bin/bash 
CONFIG="/tmp/test.cfg" 

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $1 is set, but I am lazy 
function set_config(){ 
    sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $CONFIG 
} 

# INITIALIZE CONFIG IF IT'S MISSING 
if [ ! -e "${CONFIG}" ] ; then 
    # Set default variable value 
    sudo touch $CONFIG 
    echo "myname=\"Test\"" | sudo tee --append $CONFIG 
fi 

# LOAD THE CONFIG FILE 
source $CONFIG 

echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN 
myname="Erl" 
echo "${myname}" # SHOULD OUTPUT Erl 
set_config myname $myname # SETS THE NEW VALUE 
Các vấn đề liên quan