如何在sed中使用变量

14 篇文章 0 订阅

最近写脚本经常需要用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值