Regex 用环境变量替换使用sed的文件中的文本

Regex 用环境变量替换使用sed的文件中的文本,regex,shell,sed,Regex,Shell,Sed,我有一些js文件要替换http://localhost:3010带有环境变量$SERVER e、 g.$SERVER=http://example.com 下面是一个示例文件 服务器=http://localhost:3010应该是这台服务器=http://example.com更换后 我试着跟着 find-键入f-name“*.js”-exec sed-i”s/http:\/\/localhost:3010/$SERVER/g“{}+ find-键入f-name“*.js”-exec sed-

我有一些js文件要替换
http://localhost:3010
带有环境变量$SERVER

e、 g.
$SERVER=http://example.com

下面是一个示例文件
服务器=http://localhost:3010
应该是这台
服务器=http://example.com
更换后

我试着跟着
find-键入f-name“*.js”-exec sed-i”s/http:\/\/localhost:3010/$SERVER/g“{}+

find-键入f-name“*.js”-exec sed-i's/http:\/\/localhost:3010/$SERVER/g'{}+

两者都不起作用

您可以尝试以下方法:

find . -type f -name "*.js" -exec sed -i "s~http://localhost:3010~$SERVER~g" {} +

因此,使用双引号使shell可以展开
$SERVER
,并使用备用分隔符
~
,因为
/
是变量的一部分。

问题是,shell在
sed
之前展开
$SERVER
,并且
$SERVER
中有斜线。因此
sed
获取此替换命令:

s/http:\/\/localhost:3010/http://example.com/g
。。。它有额外的未加引号的
/
s,因此是一个语法错误

您可以使用不同的分隔符(无论您在
s
之后放置什么,它都将在表达式的其余部分中查找),只要您可以选择一个您知道不会显示在
$SERVER
值中的分隔符。那么您根本不需要引用任何斜杠:

sed -i "s^http://localhost:3010^$SERVER^g"
如果您使用的是某些现代shell,如
bash
zsh
,则在展开
SERVER
时,可以使用特殊的参数替换来引用斜杠,这样做的优点是无论字符串中包含什么字符都可以工作:

 sed -i "s/http:\/\/localhost:3010/${SERVER//\//\\\/}/g"
一般结构是
${varname//old/new}
以扩展到变量
$varname
的值,所有出现的字符串
old
替换为字符串
new
。与
sed
的情况不同,无法为这个特殊的参数扩展选择另一个分隔符,因此旧字符串和新字符串中的斜杠和反斜杠必须用反斜杠引用。这导致了倾斜牙签效应;有点难看,但很有效

在变量名后使用单斜杠只会导致替换第一次出现的
字符串