linux - 通过shell脚本编辑一个js文件

标签 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 脚本执行此操作?

配置文件

 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/" 

最佳答案

您遇到的问题与一个字符串中包含 / 这一事实有关,因此您得到 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 中没有该分隔符;:, /、'?'、';'、&# 在一般情况下往往是 URL 替换的错误选择):

    sed -i \
        -e "s|\(content_bucket_name[[:space:]]*:\).*|\1'$1'|" \
        -e "s|\(dev[[:space:]]*:\).*|\1'$3'|"
    

请注意,我将您的替换表达式更改为使用 : 而不是 = 因为这是替换影响 JSON 的要求。

关于linux - 通过shell脚本编辑一个js文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33273323/

相关文章:

linux - Bash:检查 stdin 但将其原封不动地转发给另一个程序?

bash - 这个用于命名 iTerm 选项卡的脚本如何工作?

bash - 在 unix shell 脚本中迭代一系列日期

regex - 用grep检测俄语字符

shell - 将 groovy 变量传递给 shell 脚本

linux - 通过 ssh 隧道路由 RDP

linux - 当完成函数读取文件时,Bash 完成有时会与我的终端相匹配

linux - Amazon EC2 - 切换到无密码用户时提示输入密码

linux - Snort 数据采集模块编程引用

bash - 防止 bash 在变量输出中添加单引号