我要求更改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/"
答案 0 :(得分:1)
您遇到的问题与一个字符串中包含/
的事实有关,因此您得到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中没有该分隔符; :
,/
,'?', ';',&
和#
在一般情况下往往是网址替换的糟糕选择):
sed -i \
-e "s|\(content_bucket_name[[:space:]]*:\).*|\1'$1'|" \
-e "s|\(dev[[:space:]]*:\).*|\1'$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