2013-03-05 48 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,你是在管道?