несколько операций sed, создающих пустой файл - PullRequest
3 голосов
/ 17 февраля 2012

Когда в качестве части сценария оболочки используется только одна строка для файла с помощью команды sed, перенаправленный файл содержит обновленные данные, как показано ниже

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

, тогда как когда он выполняется как часть сценария оболочкигде после этого другая команда 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 ]

4 голосов
/ 17 февраля 2012

Спасибо, используя '-i, говорит [sed: недопустимый параметр - 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

, вероятно, более эффективен.

Надеюсь, это поможет.

2 голосов
/ 17 февраля 2012

Ваша проблема в том, что cat читает из того же файла, в который записывает sed.

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

Не будет работать, потому что cat и sed работают одновременно, а не один послеДругой.Чтобы исправить это, попробуйте опцию -i sed.

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