Tôi đang viết một tập lệnh bash để sửa đổi tệp cấu hình chứa một loạt các cặp khóa, giá trị. Làm thế nào tôi có thể đọc khóa và tìm giá trị và có thể sửa đổi nó?sửa đổi tệp cấu hình bằng cách sử dụng tập lệnh bash
Trả lời
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.
-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. –
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
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
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
Đ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
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.
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
bạn đặt cược đó là lý do tại sao tôi đã viết 'thêm kiểm tra lỗi' vv :) –
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?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
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
- 1. Sử dụng "màn hình thay thế" trong tập lệnh bash
- 2. Tập lệnh Bash - xác định xem tệp có được sửa đổi không?
- 3. cách sửa đổi exe.config từ tập lệnh Innosetup
- 4. Mã hóa tệp bằng tập lệnh bash shell
- 5. Tệp nguồn trong tập lệnh bash
- 6. Cách bao gồm tệp trong tập lệnh bash shell
- 7. Cách sử dụng Tập tin Cấu hình Web trong Silverlight
- 8. Thay đổi người gửi sendmail bằng cách sử dụng bash
- 9. Cách sử dụng tệp cấu hình ứng dụng trong C#?
- 10. hibernate bằng cách sử dụng chú thích hoặc sử dụng các tệp cấu hình ngủ đông
- 11. Cách Lọc từ tệp CSV sử dụng Tập lệnh Python
- 12. Chạy tập lệnh bash từ tập lệnh R
- 13. Tôi có thể tạo tập lệnh từ một mẫu bằng cách sử dụng bash như thế nào?
- 14. Phát hiện hình ảnh bị hỏng trong tập lệnh bash
- 15. Sử dụng tệp cấu hình RequireJS làm tệp xây dựng?
- 16. Màn hình GNU chạy tập lệnh bash init
- 17. Tập lệnh Bash để lưu trữ các tệp nhật ký
- 18. trình chỉnh sửa tệp cấu hình trong Eclipse
- 19. Tạo bản vá từ nhiều bản sửa đổi trong TortoiseSVN bằng cách sử dụng dòng lệnh
- 20. cách viết tập lệnh để chỉnh sửa tệp JSON?
- 21. cách sửa đổi đường dẫn cài đặt mà không cần chạy lại tập lệnh cấu hình/cmake lần nữa
- 22. mở tập tin được sửa đổi lần cuối trong thư mục bằng cách sử dụng vi
- 23. Đổi tên tập tin bằng cách sử dụng regex với bash
- 24. Sử dụng lệnh sắp xếp bash trong tên tệp có độ dài biến đổi
- 25. Sử dụng lệnh find trong bash script
- 26. Cách sử dụng các tập tin cấu hình một phần
- 27. Cách lấy ngày sửa đổi tệp bằng UTC từ Python
- 28. Xây dựng 32 bit trên Linux 64 bit bằng cách sử dụng tập lệnh cấu hình tự động?
- 29. Làm thế nào để sửa đổi tệp excel hiện có bằng cách sử dụng PHP?
- 30. Cách sửa đổi tệp cấu hình .NET trong khi cài đặt?
tôi đã cố gắng để trả lời ở đây https://stackoverflow.com/a/47509618/3343801 –