2012-02-16 342 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