2013-03-05 3 views
3

Geez, j'ai essayé les pages MAN, et plusieurs messages ici. Je suppose que je suis juste stupide parce que je ne l'ai pas.comment utiliser sed pour remplacer une chaîne dans un fichier avec une variable shell

J'ai un fichier javascript qui a {VERSION} et {DISTRO} où les valeurs de chaînes de variables doivent être remplacées comme ceci.

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

Et cette commande est en cours d'exécution pour mon shell. peu importe ce que je fais ça, ça ne marche pas ou j'ai des erreurs.

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} 

Alors, en quoi suis-je un retard? On dirait que ça devrait être très simple et direct. Voici une version démilitarisée du script afin que vous puissiez savoir ce que je fais et d'où viennent les 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 

Répondre

6

Il semble que vous essayiez une combinaison de tuyauterie pour sed et l'utilisation d'un fichier. Ce qui suit fonctionnera parfaitement,

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

Vous n'avez pas besoin d'échapper à la $, et vous ne pipe dans sed puisque vous utilisez -i pour modifier le fichier en place. Vous devez également utiliser -e pour chaque expression lorsque leur nombre est supérieur à un.

EDIT: Voici le bit dans les pages de manuel sed qui donne l'indication de la question avec option -e (moi qui souligne),

Si aucune -e, --expression, -f, ou l'option --file est donnée, alors le premier argument non-option est considéré comme le script sed à interpréter. Tous les arguments restants sont les noms des fichiers d'entrée; Si aucun fichier d'entrée n'est spécifié , l'entrée standard est lue.

+0

Cela a fonctionné parfaitement. Je n'avais pas utilisé l'évasion, mais l'ai essayé à partir d'un autre poste. Il semble que j'avais besoin du premier -e. Merci nlucaroni – NlaakALD

+0

Ah, d'accord, je pensais que tu avais peut-être oublié ça par hasard. Vous aurez besoin de '-e' sur chaque expression lorsque plusieurs sont en cours d'exécution. À votre santé. – nlucaroni

+0

Je m'en souviendrai. Merci encore. – NlaakALD

1

Vous n'avez pas besoin d'échapper à la $:

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

Et quel est $OUT_CAT_DEBUG que vous êtes dans la tuyauterie?

Questions connexes