如果我从脚本中运行这些命令:
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
这很好。
但是,如果我运行:
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
我在教程中读到,要从shell中替换环境变量,你需要停止,并“引用”$varname部分,这样它就不会直接被替换,这就是我所做的,并且只有在变量刚刚定义之前才有效。
我如何才能让sed识别$var作为一个环境变量,因为它是在shell中定义的?
一. 坏方法:更改分隔符
sed 's/xxx/'"$PWD"'/'
sed 's:xxx:'"$PWD"':'
sed 's@xxx@'"$PWD"'@'
也许这不是最终答案,
你不知道什么字符会出现在$PWD, /:或@。
如果分隔符字符在$PWD中,则会中断表达式
好的方法是替换(转义)$PWD中的特殊字符。
二. 好方法:转义分隔符
例如:
尝试将URL替换为$ URL(有:/内容)
x.com:80/aa/bb/aa.js
在字符串$tmp
<a href="URL">URL</a>
A.使用/作为分隔符
在var中转义/ as \/(在sed表达式中使用之前)
## step 1: try escape
echo ${url//\//\\/}
x.com:80\/aa\/bb\/aa.js #escape fine
echo ${url//\//\/}
x.com:80/aa/bb/aa.js #escape not success
echo "${url//\//\/}"
x.com:80\/aa\/bb\/aa.js #escape fine, notice `"`
## step 2: do sed
echo $tmp | sed "s/URL/${url//\//\\/}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
echo $tmp | sed "s/URL/${url//\//\/}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
OR
B.使用:作为分隔符(比/更具可读性)
转义:as \: in var(在sed表达式中使用之前)
## step 1: try escape
echo ${url//:/\:}
x.com:80/aa/bb/aa.js #escape not success
echo "${url//:/\:}"
x.com\:80/aa/bb/aa.js #escape fine, notice `"`
## step 2: do sed
echo $tmp | sed "s:URL:${url//:/\:}:g"
<a href="x.com:80/aa/bb/aa.js">x.com:80/aa/bb/aa.js</a>