使用bash脚本修改配置文件

Pro*_*mer 46 bash configuration-files

我正在编写一个bash脚本来修改包含一堆键/值对的配置文件.如何读取密钥并找到值并可能修改它?

Cas*_*bel 93

在黑暗中用于修改单个值的狂野刺:

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
Run Code Online (Sandbox Code Playgroud)

假设目标键和替换值不包含任何特殊的正则表达式字符,并且键值分隔符为"=".注意,-c选项是系统相关的,您可能需要省略它才能执行sed.

有关如何进行类似替换的其他提示(例如,当REPLACEMENT_VALUE中包含'/'字符时),这里有一些很好的例子.

  • -c在我的环境中似乎无效.当我摆脱-c时,它有效.谢谢. (12认同)
  • 非常有用的脚本.如果所有的键都从行的开头开始,可以考虑在`$ TARGET_KEY`之前添加`^`,否则如果你有两个键,比如`even = 2`和`noteven = 1`,你最终会改变它们. (4认同)
  • 如果有人在Mac环境中执行它,您可能希望删除-c并在-i之后添加''.就像`sed -i''s ......"$ CONFIG_FILE` (3认同)
  • 如果该值以前不存在,那么添加该值怎么样? (3认同)

Rud*_*dom 15

希望这有助于某人.我创建了一个自包含的脚本,它需要对各种进行配置处理.

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

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $2 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
Run Code Online (Sandbox Code Playgroud)


vla*_*adr 5

假设您有一个key=value成对的文件,可能在 周围有空格,即使键或值包含特殊的正则表达式序列,=您也可以随意删除、就地修改或追加键值对: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?)"
Run Code Online (Sandbox Code Playgroud)