通过shell脚本编辑js文件

时间:2015-10-22 04:15:05

标签: linux bash shell sed sh

我要求更改js文件config.js的内容,该文件包含以下值:

dev:'https://api-beta.com'
content_bucket_name: 'content-beta'

我想使用shell脚本更改此内容并保存文件。更改的内容可能如下所示:

dev:'https://api-production.com'
content_bucket_name: 'live-bucket'

我如何通过shell脚本执行此操作?

config.js

 unifiedTest.constant('CONFIG', {
    env : 'dev',
    api : {
        dev : 'https://api-beta.com', 
    },
    content_bucket_name :"content-beta",
});

shell脚本我试过

#!/bin/bash
file=config.js
content_bucket_name=$1
dev=$2

sed -i -e "s/\(content_bucket_name=\).*/\1$1/" \
-e "s/\(dev=\).*/\1$3/" 

2 个答案:

答案 0 :(得分:1)

您遇到的问题与一个字符串中包含/的事实有关,因此您得到s/\(dev=\).*/\1https://api-production.com/,其中/个分隔符太多。你有很多选择,但这里有两个最有意义的选择:

  1. 使用awk(为了便于阅读而插入换行符):

    awk -v name="$1" -v url="$3" '
    /content_bucket_name[[:space:]]*:.*/
    {
        /* Substitute one occurrence of :.* with :"{name}". */
        sub(/:.*/, ":\"" name "\"")
    }
    /dev[[:space:]]*:.*/
    {
        /* Substitute one occurrence of :.* with :"{url}". */
        sub(/:.*/, ":\"" url "\"")
    }
    '
    
  2. 为表达式使用不同的分隔符,例如|(希望URL中没有该分隔符; :/,'?', ';',&#在一般情况下往往是网址替换的糟糕选择):

    sed -i \
        -e "s|\(content_bucket_name[[:space:]]*:\).*|\1'$1'|" \
        -e "s|\(dev[[:space:]]*:\).*|\1'$3'|"
    
  3. 请注意,我将您的替换表达式更改为使用:而不是=,因为这需要替换来影响JSON。

答案 1 :(得分:0)

sed -i 's#dev : .*#dev : '"'https://api-production.com'",'#' config.js
sed -i 's#content_bucket_name:.*#content_bucket_name:''"live-bucket"','#' config.js