sed 替换美元符的问题

sed 替换美元符的问题
20121005 Chenxin

pw=echo $pass_w|sed 's/\\$/\\\\$/g'

eg:

!/bin/bash

i=echo "!@#$%" #i变量中会被赋值一个包含"$"符号的字符
j=echo $i|sed 's/\\$/\\\\$ /g' #sed的第一个$符号前可以是2个或者是3个转义符,其他不行;第二个$符号前必须是4个转义符;
#其他情况下,会默认将i变量的结束符给替换成一个$,j变量就变成了“!@#$%$”,最后多了一个$符号;
echo "$i=$i"
echo "$j=$j"

执行后输出:
$i=!@#$%
$j=!@#$%

通过这种方式,就规避了expect中的send命令默认将$pass_w中的"$"后面的部分当做变量来处理,从而造成找不到值的情况;

备注:
以上尝试了很多次才成功,至于根本原因,如下:

原因分析:
直接在shell环境下,通过 手动输入命令方式执 行:
echo "123$567" |sed 's/$/\$/g'
便将123$567转换为123$567了;
但以上情况如果放置 到脚本文件里, 比如t.sh中执行就会被替换成123$567$的情况;
因为是在双重shell下,$前必须是两层转义,也就变成:
sed 's/\$/\\$/g' (标准的写法)
第一次转义后变成 sed 's/$/\$/g',然后在通过一次转义,就达到预期的目的了(sed是发起的一个独立linux进程);
当send指令执行send 123$567时,其实输入给对端的是 123$567,也就是预期的情况了(tcl的send执行中,跟tcl同样会进行转义操作);
:)

posted @ 2020-04-20 16:18  ChanixChen  阅读(1080)  评论(1编辑  收藏  举报