Regex 用环境变量替换使用sed的文件中的文本
我有一些js文件要替换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-
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
的情况不同,无法为这个特殊的参数扩展选择另一个分隔符,因此旧字符串和新字符串中的斜杠和反斜杠必须用反斜杠引用。这导致了倾斜牙签效应;有点难看,但很有效
在变量名后使用单斜杠只会导致替换第一次出现的旧
字符串