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版本确实存在错误,也应转义“坏格式”^*
。此外,请为函数选择其他名称(可能存在)