我需要更改 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/
,/
分隔符过多。您有多种选择,但这里有两个最有意义的选择:
使用
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 "\"") } '
为表达式使用不同的分隔符,例如
|
(希望 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/