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

Shell 具有特殊字符替换的复杂字符串,shell,sed,terminal,string-substitution,Shell,Sed,Terminal,String Substitution,我必须将字符串黑名单:[/^\/\u/,/\/[^\/?]+\.[^\/]+$/]替换为 黑名单:文件中的[/^\/\/,/\/[^\/?]+\.[^\/]+$/,/\/first |\/second |\/third/]。 我想使用sed命令在shell中完成它。 我选择使用~作为分隔符,并尝试使用变量,但什么也没发生 例如: VarA=“黑名单:[/^\/\u/,/\/[^\/?]+\.[^\/]+$/]” VarB=“黑名单:[/^\/\/\/,/\/[^\/?]+\.[^\/]+$/,/

我必须将字符串
黑名单:[/^\/\u/,/\/[^\/?]+\.[^\/]+$/]
替换为
黑名单:文件中的[/^\/\/,/\/[^\/?]+\.[^\/]+$/,/\/first |\/second |\/third/]
。 我想使用
sed
命令在shell中完成它。 我选择使用~作为分隔符,并尝试使用变量,但什么也没发生

例如:

VarA=“黑名单:[/^\/\u/,/\/[^\/?]+\.[^\/]+$/]”

VarB=“黑名单:[/^\/\/\/,/\/[^\/?]+\.[^\/]+$/,/\/first/second/second/third/]”

sed“s~$VarA~$VarB~”service worker.js

你能帮我吗?
谢谢

一些元字符,如
\
[
$
必须用单引号引起来(这在您的情况下是不可能的)或转义(用反斜杠,也必须用自身转义)

可以使用字符串操纵来替换

在字符串上运行此函数

escape() {
  local var="$1"

  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($0,old) { $0 = substr($0,1,s-1) new substr($0,s+lgth) }
    { print }
' file 
foo
blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/, /\/first|\/second|\/third/]
bar

查看是否有帮助。如果这看起来很复杂,请查看可能有更简单的方法,只需
printf-v VarA“%q'$VarA”
,但我的printf版本确实存在错误,也应转义“坏格式”
^*
。此外,请为函数选择其他名称(可能存在)