【问题标题】:how to use sed to replace a string in a file with a shell variable如何使用 sed 将文件中的字符串替换为 shell 变量
【发布时间】:2013-03-05 17:13:55
【问题描述】:

天哪,我尝试了 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}'
};

这个命令为我的 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

【问题讨论】:

    标签: linux shell sed


    【解决方案1】:

    您似乎正在尝试将管道连接到 sed 和使用文件的组合。以下将完全正常,

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

    您无需转义$,也无需通过管道输入sed,因为您使用-i 就地修改文件。当每个表达式不止一个时,您还需要为每个表达式使用-e

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

    如果没有给出-e、--expression、-f 或--file 选项,那么第一个 非选项参数被当作 sed 脚本来解释。 全部 其余参数是输入文件的名称;如果没有输入文件 指定,然后读取标准输入。

    【讨论】:

    • 效果很好。我没有使用转义,而是从另一个帖子中尝试过。似乎我需要第一个-e。谢谢nlucaroni
    • 啊,好吧,我想你可能只是不小心把它漏掉了。当执行多个表达式时,每个表达式都需要-e。干杯。
    • 我会记住的。再次感谢。
    【解决方案2】:

    你不需要转义$

    $ 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 是什么?

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2021-07-04
      • 2020-01-30
      • 2016-10-06
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多