使用 sed 修改配置文件

最近写一些Debian包安装脚本。由于希望安装时能提示用户输入一些初始配置参数,用sed倒来倒去,终于弄出来。

 

sed功能强大,但参数繁多,一天不用就忘。还是找个地方记下来,一来给大家分享,二来这里比记在本子上强。

 

一个典型的例子是,在配置文件中修改一个子网IP。在这个配置文件中,本人定义的子网IP格式是 网段IP加掩码位数:

如 192.168.10.4/26

 

setup_dht_network() { echo "Setup BE Network IP" echo if [ -z $DHT_NETWORK ]; then echo "Network IP for BE did not set." input_networkip echo "dht_network=$DHT_NETWORK" >> "$SVHOME/vault.conf" else echo -n "Are you going to change BE network IP $DHT_NETWORK (y/n)?" read accept if [ "$accept" = "y" ]; then input_networkip sed -i 's/dht_network.*/dht_network='$net$bit'/' "$SVHOME/vault.conf" fi fi echo BE Network IP is $DHT_NETWORK }

 


 

 

还有一个进一步的例子,就是在参数是多个值用分号(;)隔开的,需要遍历每个值做事情。下面就是对类似storage_root=/path1;path2;/path3;/path4 进行文件遍历检查文件完整性。

 

分两步,一是取出参数“/path1;path2;/path3;/path4”,二是将分号替换成空格,然后用for循环:

 

_recover_keydb() { STORAGEROOTS=`sed -n '/storage_root/'p "$SVHOME"/vault.conf | awk -F= '{print $2}' | sed 's/;/ /g'` for root in $STORAGEROOTS; do cd $root echo " Checking $root ..." DATFILES=`ls *.dat` if [ -z "$DATFILES" ]; then echo " NO DAT FILES. TERMINATED!" exit 1 fi DBFILES=`ls *.db` if [ -z "$DBFILES" ]; then echo " (no key db files, rebuild from dat files.)" for file in $DATFILES; do $BIN_PATH/keydb-rebuild -d $root $(basename $file .dat) if [ "$?" -ne "0" ]; then echo " Rebuild $file fail" exit 1; fi done else for file in $DBFILES; do $BIN_PATH/keydb-rebuild -d $root $(basename $file .db) if [ "$?" -ne "0" ]; then echo " Rebuild $file fail" exit 1; fi done fi done }

 

 

 


 

 

另外一个困扰我很久的问题是分割符转义。好比上面的例子,如果要将带有“/“的字符串替换到文件中,总是出错。比如:

将  storage_root=/path1;/path2;/path3;/path4  替换到文件中的 storage_root 的设置。

 

后来经高人提醒,原来sed可以使用其他分割符号的,如下面的命令,就轻松搞定了:

 

//用“|”来代替“/”作为sed的分割符号 STORAGE_ROOT=/path1;/path2;/path3;/path4 sed -i "s|storage_root/ *=.*|storage_root = $STORAGE_ROOT|g" "$SVHOME"/vault.conf 

你可能感兴趣的:(零碎札记)