Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130524
  • 博文数量: 25
  • 博客积分: 1543
  • 博客等级: 上尉
  • 技术积分: 271
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-07 16:40
文章分类

全部博文(25)

文章存档

2011年(6)

2010年(19)

我的朋友

分类:

2011-08-04 17:00:55

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


阅读(4651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~