2010年1月14日 星期四

[Bash] 將檔案內的字串進行取代

太習慣寫 php 了,其實也有一陣子用 php 當作 script 管機器,最近則是試過 python ,所以,就來試試 bash 吧!


首先會碰到的問題是如何處理參數,這部分可以在 Getopt and getopts 看到很豐富的範例,接下來還可以逛逛 鳥哥的 Linux 私房菜 - 第十三章、學習 Shell Scripts #善用判斷式 ,就可以完成很多事囉!接著我想做的字串取代,就可以使用 sed 來處理,相關參考資料 Bash Shell: Replace a string with another string in all files using sed and perl -pie


最後,留個範例給自己吧


#!/bin/bash

WORK_DIR=
OPTS_ENABLE="false"

usage_help()
{
        echo "Usage> $0 -i \"Path\"  ..."
        echo "    -i \"/tmp\"          # path for write a config file"
}

args=`getopt i:e $*`
if test $? != 0
        then
                usage_help
        exit 1
fi
set -- $args
for i do
        case "$i" in
                -i) shift; WORK_DIR=$1 ;shift;;
                -e) shift; OPTS_ENABLE="true" ;shift;;
        esac
done

# check install path
if test ! -r $WORK_DIR || test ! -x $WORK_DIR || test ! -w $WORK_DIR ; then
        echo "Please Check WorkDir: [$WORK_DIR]"
        exit 1
fi

FILE_CONFIG=$WORK_DIR/config

# bakcup & replace
if test -r $FILE_CONFIG ; then

        cp $FILE_CONFIG $FILE_CONFIG.bak.`date +%Y%m%d%H%M%S`
        sed -e "s/KEY/$OPTS_ENABLE/g" $FILE_CONFIG > $FILE_CONFIG
fi


其中,若存在 bash shell 裡的變數是帶有路徑的, ex: x=/path/bin.exe , 那使用 sed -e "s/KEY/$x/g" $FILE_CONFIG > $FILE_CONFIG 會出問題,解法就是先把 x 變數中的 '/' 取代成 '\/' 吧!


x=$(echo $x | sed "s/\//\\\\\//g")


沒有留言:

張貼留言