具有特殊字符替换的复杂字符串
Complex string with special characters substitutions
我必须将字符串 blacklist:[/^\/_/,/\/[^\/?]+\.[^\/]+$/]
替换为
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]
在文件中。
我想在 shell 中使用 sed
命令来完成它。
我选择使用 ~ 作为分隔符并尝试使用变量但没有任何反应。
示例:
VarA="blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]"
VarB="blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]"
sed "s~$VarA~$VarB~" service-worker.js
你能帮帮我吗?
谢谢
某些元字符,如 \
[
$
必须用单引号引起来(这在您的情况下是不可能的)或转义(使用反斜杠,必须使用本身也是)
您可以使用字符串操作来替换
运行 这个函数作用于你的字符串
escape() {
local var=""
var="${var//\/\\}" # \
var="${var//\[/\\[}" # [
var="${var//$/\$}" # $
printf "%s" "$var"
return 0
}
VarA=$(escape "$VarA")
VarB=$(escape "$VarB")
sed 不理解文字字符串,只需使用类似于 awk 的工具即可:
$ cat file
foo
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]
bar
$ VarA='blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]'
$ VarB='blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]'
$ VarA="$VarA" VarB="$VarB" awk '
BEGIN { old=ENVIRON["VarA"]; lgth=length(old); new=ENVIRON["VarB"] }
s = index([=10=],old) { [=10=] = substr([=10=],1,s-1) new substr([=10=],s+lgth) }
{ print }
' file
foo
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]
bar
我必须将字符串 blacklist:[/^\/_/,/\/[^\/?]+\.[^\/]+$/]
替换为
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]
在文件中。
我想在 shell 中使用 sed
命令来完成它。
我选择使用 ~ 作为分隔符并尝试使用变量但没有任何反应。
示例:
VarA="blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]"
VarB="blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]"
sed "s~$VarA~$VarB~" service-worker.js
你能帮帮我吗? 谢谢
某些元字符,如 \
[
$
必须用单引号引起来(这在您的情况下是不可能的)或转义(使用反斜杠,必须使用本身也是)
您可以使用字符串操作来替换
运行 这个函数作用于你的字符串
escape() {
local var=""
var="${var//\/\\}" # \
var="${var//\[/\\[}" # [
var="${var//$/\$}" # $
printf "%s" "$var"
return 0
}
VarA=$(escape "$VarA")
VarB=$(escape "$VarB")
sed 不理解文字字符串,只需使用类似于 awk 的工具即可:
$ cat file
foo
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]
bar
$ VarA='blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/]'
$ VarB='blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]'
$ VarA="$VarA" VarB="$VarB" awk '
BEGIN { old=ENVIRON["VarA"]; lgth=length(old); new=ENVIRON["VarB"] }
s = index([=10=],old) { [=10=] = substr([=10=],1,s-1) new substr([=10=],s+lgth) }
{ print }
' file
foo
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]
bar