2013-03-05 49 views
3

geez,我嘗試了MAN頁面,並在這裏發佈了幾個帖子。我想我只是愚蠢的,因爲我',沒有得到它。如何使用sed替換文件中的字符串與shell變量

我有一個JavaScript文件{VERSION}和{DISTRO},其中變量字符串值應該像這樣替換。

var MyObject = { 

    /** 
    * @property {string} VERSION Holds the current version of the framework 
    */ 
    VERSION: '{VERSION}', 
    /** 
    * @property {string} DISTRO Holds the distrobution tag of the framework 
    */ 
    DISTRO:  '{DISTRO}' 
}; 

而這個命令爲我的shell運行。無論我這樣做,它不起作用,或者我得到錯誤。

VERSION="0.9.0" 
DISTRO="Developer" 
OUT_CAT=$OUT_CAT_DEBUG 


${OUT_CAT} | sed -i "s/{VERSION}/\$VERSION/" -e "s/{DISTRO}/\$DISTRO/" ${OUT_CAT} 
#sed -i "s/{VERSION}/$VERSION/" -e "s/{DISTRO}/$DISTRO/" ${OUT_CAT} 

那麼,我是一個什麼樣的方式?看起來應該非常簡單直接。

[編輯] 這裏是腳本的脫機版本,所以你可以告訴我在做什麼以及變量來自哪裏。

#!/bin/bash 
VERSION="0.9.0" 

DEV_DIR=../lib 
DIST_DIR=../dist 
WEB_DIR=/d/Android_Dev/GitHUB/WEB/h5c3/dist 

OUT_CAT_DEBUG=h5c3.debug.cat 
OUT_MIN_DEBUG=h5c3.debug.min 
OUT_ZIP_DEBUG=$DIST_DIR/h5c3.debug.gz 

OUT_CAT_RELEASE=$DIST_DIR/h5c3.release.cat 
OUT_MIN_RELEASE=h5c3.release.min 
OUT_ZIP_RELEASE=$DIST_DIR/h5c3.release.gz 

echo Building Version "$1"... 

if [ "$1" == debug ]; then 
    DISTRO="Developer" 
    OUT_CAT=$OUT_CAT_DEBUG 
    OUT_MIN=$OUT_MIN_DEBUG 
    OUT_ZIP=$OUT_ZIP_DEBUG 
    # empty it out 
    > ${OUT_CAT} 
    cat $DEV_DIR/packed.js >> ${OUT_CAT} 
    #Development support 
    cat $DEV_DIR/h5c3_debug.js >> ${OUT_CAT} 
elif [ "$1" == release ]; then 
    DISTRO="Production" 
    OUT_CAT=$OUT_CAT_RELEASE 
    OUT_MIN=$OUT_MIN_RELEASE 
    OUT_ZIP=$OUT_ZIP_RELEASE 
    # empty it out 
    > ${OUT_CAT} 
    cat $DEV_DIR/packed.js >> ${OUT_CAT} 
    cat $DEV_DIR/h5c3_release.js >> ${OUT_CAT} 
else 
    #publish.sh debug 
    #publish.sh release 
    exit 2 
fi 

#Build Game Core 
cat $DEV_DIR/core/stacktrace.js >> ${OUT_CAT} 

#Build Externals 
cat $DEV_DIR/ext/base64.js >> ${OUT_CAT} 

#Build Engine 
cat $DEV_DIR/engine/boot.js >> ${OUT_CAT} 

#Build Internal Components 
cat $DEV_DIR/components/component.js >> ${OUT_CAT} 

#Build Systems 
cat $DEV_DIR/systems/system.js >> ${OUT_CAT} 

#Build Framework 
cat $DEV_DIR/framework/page.js >> ${OUT_CAT} 

#Build Web App 
cat $DEV_DIR/webapp/game.js >> ${OUT_CAT} 

if [ "$1" == debug ]; then 
    #Development support 
    cat $DEV_DIR/debugger/profiler.js >> ${OUT_CAT} 
    cat $DEV_DIR/debugger/console.js >> ${OUT_CAT} 
    cat $DEV_DIR/debugger/debug.js >> ${OUT_CAT} 
    cat $DEV_DIR/debugger/developer.js >> ${OUT_CAT} 
fi 

if [ "$1" == release ]; then 
    echo Removing any debug calls from ${OUT_CAT} 
    sed -i '/this.debug/d' ${OUT_CAT} 
fi 

echo "Inserting distribution & version in ${OUT_CAT}" 
${OUT_CAT} | sed -i "s/{VERSION}/\$VERSION/" -e "s/{DISTRO}/\$DISTRO/" ${OUT_CAT} 

echo Minimizing...[${OUT_CAT} to ${OUT_MIN}] 
> ${OUT_MIN} 
java -jar yuicompressor-2.4.7.jar ${OUT_CAT} -o ${OUT_MIN} 

#echo Compressing...[${OUT_MIN} to ${OUT_ZIP}] 
#gzip --best --force ${OUT_MIN} 

echo Copying to WEB Folder... 
cp --update ${OUT_MIN} ${WEB_DIR} 

echo Complete. 
exit 

回答

6

這似乎是你正在嘗試管道組合sed和使用文件。下面的工作完全正常,

sed -i -e "s/{VERSION}/${VERSION}/" -e "s/{DISTRO}/${DISTRO}/" ${OUT_CAT} 

你不需要逃避$,你不要管進入sed由於您使用-i修改就地文件。當每個表達式不止一個時,您還需要使用-e

編輯:這是在給問題的指示與-e選項(重點煤礦)的sed的手冊頁位,

如果沒有-e,--expression,-f,或--file選項給出,那麼第一個 非選項參數將作爲解釋的sed腳本。 所有 剩餘參數是輸入文件的名稱;如果沒有指定輸入文件 ,則讀取標準輸入。

+0

完美的工作。我沒有使用逃生,但從另一個帖子嘗試。似乎我需要第一個-e。謝謝你nlucaroni – NlaakALD 2013-03-05 19:36:33

+0

啊好吧,我想你可能已經意外地離開了那個。在執行多個表達式時,每個表達式都需要「-e」。乾杯。 – nlucaroni 2013-03-05 19:40:54

+0

我會記住的。再次感謝。 – NlaakALD 2013-03-05 19:45:41

1

你不需要逃避$

$ DISTRO="Developer" 

$ VERSION="0.9.0" 

$ sed -e "s/{VERSION}/$VERSION/" -e "s/{DISTRO}/$DISTRO/" file 
var MyObject = { 

    /** 
    * @property {string} VERSION Holds the current version of the framework 
    */ 
    VERSION: '0.9.0', 
    /** 
    * @property {string} DISTRO Holds the distrobution tag of the framework 
    */ 
    DISTRO:  'Developer' 
}; 

什麼是$OUT_CAT_DEBUG,你是在管道?