多个sed操作创建空文件

时间:2012-02-16 22:25:26

标签: shell sed ksh

当作为shell脚本的一部分时,只有一行使用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

2 个答案:

答案 0 :(得分:4)

  

谢谢,使用'-i,说[sed:illegal option - i]

然后你必须使用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

可能更有效率。

我希望这会有所帮助。

答案 1 :(得分:2)

你的问题是cat正在读取sed写入的同一个文件。

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

无效,因为catsed同时运行,而不是一个接一个地运行。 要解决此问题,请尝试sed的-i选项。

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