如何使用sed用shellvariablesreplace文件中的string

Geez,我尝试了MAN页面,还有几个post在这里。 我想我只是愚蠢的,因为我没有得到它。

我有一个JavaScript文件{VERSION}和{DISTRO},其中variablesstring值应该像这样replace。

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} 

那么我该怎么办? 看起来应该是非常简单直接的。

[编辑]这是脚本的脚本,所以你可以告诉我在做什么,variables来自哪里。

 #!/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 

这似乎是你正在尝试管道组合sed和使用文件。 以下将工作得很好,

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

你不需要转义$ ,而且你不用管道入sed因为你正在使用-i来就地修改文件。 当每个表达式不止一个时,还需要使用-e

编辑:这是sed手册页中给出与-e选项(强调我的)的问题的指示位,

如果没有给出-e,–expression,-f或–file选项,则第一个非选项参数被当作sed脚本解释。 所有剩余的参数是输入文件的名称 ; 如果没有指定输入文件,则读取标准输入。

你不需要逃避$

 $ 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