2012-02-16 68 views
3

當作爲外殼腳本的一部分只有一行被使用sed命令重定向的文件包含已更新的數據上的文件操作,如下面多個SED操作創建空文件

cat ${PROP_PATH}/${PROP_FILE} | sed "s!${ISTR_KEY}=.*!${ISTR_KEY}=${SIM_ISTR_KEY_VAL}!" > ${UPDATEDPROPS_DIR}/${PROP_FILE} 

當作爲一部分被執行,而的shell腳本,在這之後的另一個sed命令在最後我得到的是一個空文件,爲什麼更新相同的文件,如下面的腳本? .....想法請。

(檢查「switchAll2Sim()」下面的函數)

#!/bin/ksh 
# 
SIM_ICR_KEY_VAL="http://www.example.com/sim/http/icr" 
SIM_ISTR_KEY_VAL="http://www.example.com/sim/http/istr" 
SIM_GT_KEY_VAL="http://www.example.com/sim/http/gtr" 
# 
ICR_KEY="interface.url.icr" 
ISTR_KEY="interface.url.istr" 
GT_KEY="interface.ws.url.gt" 
## Property Files 
PROP_PATH="" 
PROP_FILE="properties" 
## 
DATE=`date +%m%d%Y` 
DATETIME=`date +%m%d%Y-%T` 
BCKUP_DIR=_bckup 
UPDATEDPROPS_DIR=_updatedprops 
# ---------------------------------- 
pause(){ 
echo "Press [Enter] key to continue..." 
    read fackEnterKey 
} 

permissions(){ 
    chmod 777 ${UPDATEDPROPS_DIR} 
} 

backup(){ 

    if [ ! -d "${BCKUP_DIR}" ]; then 
    mkdir ${BCKUP_DIR} 
    fi 

    if [ ! -d "${UPDATEDPROPS_DIR}" ]; then 
    mkdir ${UPDATEDPROPS_DIR} 
    fi 

    permissions 

    ## keep backup of properties 
    cp ${PROP_PATH}/${PROP_FILE} ${BCKUP_DIR}/${PROP_FILE}_${DATETIME} 

    echo "Backup of property files completed at: " ${DATETIME} 
} 

#------------------------------------------------------------- 
# switch all properties to SIM 
#------------------------------------------------------------- 
switchAll2Sim(){ 

    backup 

    # 
    # update files 

    cat ${PROP_PATH}/${PROP_FILE} | sed  "s!${ISTR_KEY}=.*!${ISTR_KEY}=${SIM_ISTR_KEY_VAL}!" > ${UPDATEDPROPS_DIR}/${PROP_FILE} 
    cat ${UPDATEDPROPS_DIR}/${PROP_FILE} | sed "s!${ICR_KEY}=.*!${ICR_KEY}=${SIM_ICR_KEY_VAL}!" > ${UPDATEDPROPS_DIR}/${PROP_FILE} 
    cat ${UPDATEDPROPS_DIR}/${PROP_FILE} | sed "s!${GT_KEY}=.*!${GT_KEY}=${SIM_GT_KEY_VAL}!" > ${UPDATEDPROPS_DIR}/${PROP_FILE} 

    echo "Switch all to SIM completed at: " ${DATETIME} 

    pause 
} 

# switch all properties to real 
#------------------------------------------------------------- 
switchAll2Real(){ 
    pause 
} 
#------------------------------------------------------------- 
dispCurrentStats(){ 

    echo "Displaying current properties..." 
    echo "*********************************" 
    echo " File: " ${PROP_PATH}/${PROP_FILE} 
    grep ${ICR_KEY} ${PROP_PATH}/${PROP_FILE} 
    grep ${ISTR_KEY} ${PROP_PATH}/${PROP_FILE} 
    grep ${GT_KEY} ${PROP_PATH}/${PROP_FILE} 
    # 
    echo "*********************************" 
    pause 
} 

show_menus() { 
    clear 
    echo "~~~~~~~~~~~~~~~~~~~~~"  
    echo " M E N U" 
    echo "~~~~~~~~~~~~~~~~~~~~~" 
    echo "1. Display current properties" 
    echo "2. Switch all to real" 
    echo "3. Switch all to simulator" 
    echo "4. Exit" 

} 

# read input from the keyboard and take a action 
read_options(){ 

    read option 
    case $option in 
     1) dispCurrentStats ;; 
     2) switchAll2Real ;; 
     3) switchAll2Sim ;; 
     4) exit 0;; 
     *) echo "Please insert options 1 ~ 4";; 
    esac 
} 

# ----------------------------------- 
# Main - infinite loop 
# ------------------------------------ 
while true 
do 
    show_menus 
    read_options 
done 

回答

3

謝謝,使用「-i,說[sed的:非法選項 - 我]

然後,你必須與TMP文件的工作。

cp foo foo.tmp 
sed "s/x/y/" foo.tmp > foo 
/bin/rm foo.tmp 

OR

sed "s/x/y/" foo > foo.tmp 
/bin/mv -f foo.tmp foo 

可能是更有效的。

我希望這會有所幫助。

+0

謝謝了,我知道了現在的工作,再加上你的建議貓已被刪除...我用你的第二個選項,但沒有「-i」 – sid 2012-02-16 23:11:00

+0

是的,我固定的現在。祝你好運。 – shellter 2012-02-16 23:44:40

2

你的問題是,貓是從在sed寫入同一文件中讀取。

cat foo | sed "s/x/y/" > foo 

不會在同一時間,不是一前一後的工作,因爲catsed運行。 爲了解決這個問題嘗試-i選項sed

sed -i "s/x/y/" foo 
+0

謝謝,使用「-i,說[sed的:非法選項 - 我] – sid 2012-02-16 22:34:47

+0

請注意,當使用'-i',你不應該也使用'...> foo'輸出寫入到文件因爲它會清除它。這是我犯的一個錯誤。 – 2017-09-27 07:23:48