背景
想写一个自动修改配置的脚本,输入一个 mysql jdbc 的连接路径,然后替换目标配置中的模版内容,明明很简单的一个内容,结果卡在了 &
这个符号上。
& 到底是什么特殊字符呢?结论:它代表要替换的旧的字符串。
& 代表什么
在 sed 中 ,& 有特殊含义,但是它不是正则表达式的特殊字符。
脚本接收并替换流程
编写一个脚本 mysql_config.sh ,用来对一个数据库配置文件中的 jdbcUrl 部分进行替换,第一个参数是 URL ,替换过程如下:
dbUrl=$2
pathEscaped=$(echo $dbUrl | sed -e 's/\//\\\//g')
pathEscaped=$(echo $pathEscaped | sed -e 's/\&/\\&/g')
originalUrl='jdbc:mysql://IP:port/dbname'
oldEscaped=$(echo $originalUrl | sed -e 's/\//\\\//g')
echo $oldEscaped
sed -i -c "s/$oldEscaped/$pathEscaped/" /myapp/conf/jdbc.properties
脚本注意事项,路径中包含 /
特殊字符,必须转义为 \/
,第一个转换语句:
sed -e 's/\//\\\//g'
sed -e 's/\&/\\&/g')
old 字符串为 /
,特殊字符转义为 \/
new 字符串部分是 \/
,目标字符串写出转义之后的值就是 \\\/
,这样才能得到真正要替换的新路径。
& 字符替换为转义后的普通符号 \&
,最终放到目标串中应该是 \\\&
。
sed -i -c "s/old/new/"
命令执行的时候,如果包含特殊字符,必须都逐个转义,才能得到正确的结果。