Измените файл конфигурации с помощью сценария удара

Я пишу сценарий удара для изменения файла конфигурации, который содержит набор пар ключ/значение. Как я могу считать ключ и найти значение и возможно изменить его?

46
задан Benjamin W. 13 August 2018 в 19:51
поделиться

5 ответов

Дикий удар в темноте для изменения одного значения:

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

при условии, что целевой ключ и значение замены не содержат каких-либо специальных символов регулярного выражения, и что ваш разделитель "ключ-значение" - "=". Обратите внимание, что опция -c зависит от системы, и вам может потребоваться опустить ее для выполнения sed.

Другие советы о том, как выполнять аналогичные замены (например, когда REPLACEMENT_VALUE содержит символы '/'), можно найти здесь .

93
ответ дан 26 November 2019 в 20:14
поделиться

Предполагая, что у вас есть файл из пар ключ = значение , возможно с пробелами вокруг = , вы может удалять, изменять на месте или добавлять пары ключ-значение по желанию с помощью awk , даже если ключи или значения содержат специальные последовательности регулярных выражений:

# 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?)"
3
ответ дан 26 November 2019 в 20:14
поделиться
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
2
ответ дан 26 November 2019 в 20:14
поделиться

в целом легко извлечь информацию с помощью grep и cut:


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

для обновления вы можете сделать что-то вроде этого:


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

это, очевидно, не будет поддерживать порядок пар ключ-значение. добавьте проверку ошибок, чтобы убедиться, что вы не потеряете свои данные.

0
ответ дан 26 November 2019 в 20:14
поделиться

Предположим, ваш файл конфигурации имеет следующий формат:

CONFIG_NUM=4
CONFIG_NUM2=5
CONFIG_DEBUG=n

В вашем сценарии bash, вы можете использовать:

CONFIG_FILE=your_config_file
. $CONFIG_FILE

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

$ CONFIG_NUM , $ CONFIG_NUM2 , $ CONFIG_DEBUG - это то, что вам нужно.

После того, как вы прочитаете значения, их будет легко записать обратно:

echo "CONFIG_DEBUG=y" >> $CONFIG_FILE
-1
ответ дан 26 November 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: