如何在sed中使用变量

最近写脚本经常需要用sed去改写文件,其中就遇到一个问题改写的内容可以通过变量来控制.

例如,更改mysql配置文件的server-id


PORT=3307
sed -i 's/\(^server[_-]id[ \t]*=[ \t]*\)[0-9]*/\1'"${PORT}"'/g 
my.cnf


上面这种方法可以将port变量插入到sed中并替换my.cnf文件的server-id值.这是一直方法,还有个改进方法.

sed -i "s/\(^server[_-]id[ \t]*=[ \t]*\)[0-9]*/\1${PORT}/g" my.cnf

把 sed 命令的单号换成双引号,这样看起来要聪明一些.这个例子port变量没有任何其他符号,加入需要修改成一个带有路径的变量如何来处理?

例如,更慢日志文件名加上路径

原配置文件中log_slow_queries = mysql.log,想更改成/var/mysqlslow.log

SLOWLOG="/var/mysqlslow"
sed -i "s/\(^log_slow_queries[ \t]*=[ \t]*\)[a-z]*/\1${SLOWLOG}/g" my.cnf

这样可以么.执行下就知道

     sed: -e expression #1, char 47: unknown option to `s'

不得行?要出错?为啥子?

因为变量slowlog里有"/"会被sed解释.

有人可能会想到 slowlog="\/var\/mysqlslow".(我就这么想的)


我真正的需求是SLOWLOG="${CHROOT_DIR}/${PORT}/var/mysqlslow"


傻眼了难道要吧chroot_dir里的"/"也转义一下,未免太笨了点.

后来发现最简单的方法(你肯定比我先想到):

sed -i "s#\(^log_slow_queries[ \t]*=[ \t]*\)[a-z]*#\1${SLOWLOG}#g" my.cnf


你可能感兴趣的:(如何在sed中使用变量)