具有特殊字符替换的复杂字符串

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