3

ねえ、私はMANページとここにいくつかの投稿を試しました。私はそれを理解していないので、私はただ愚かだと思います。

{VERSION} と {DISTRO} を含む JavaScript ファイルがあり、変数文字列の値を次のように置き換える必要があります。

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}'
};

そして、このコマンドは私のシェルで実行されています。これを何をしても機能しないか、エラーが発生します。

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
4

2 に答える 2

7

sed へのパイプとファイルの使用を組み合わせようとしているようです。以下は完全に正常に動作します。

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

をエスケープする必要はありません。ファイルをその場で変更するために使用しているため、$パイプを使用する必要もありません。また、式が複数ある場合は、各式を使用する必要があります。sed-i-e

編集:-eこれは、オプションの問題を示すsedマニュアルページのビットです(強調鉱山)、

-e、--expression、-f、または --file オプションが指定されていない場合、オプション以外の最初の引数が、解釈する sed スクリプトとして使用されます。残りの引数はすべて入力ファイルの名前です。入力ファイルが指定されていない場合は、標準入力が読み取られます。

于 2013-03-05T17:22:03.047 に答える
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、あなたが配管しているのは何ですか?

于 2013-03-05T17:22:29.293 に答える