您的位置:首页 > 运维架构 > Linux

如何在linux下快速替换多个文件的文本?

2011-02-19 13:19 816 查看
哥现在参与的产品无比庞大,每次部署环境,都要修改无数配置文件,让开发/测试尤其是去客户现场实施的人员头疼不已.据粗略估计,有数十个模块,每个模块下面一个配置文件,模块之间藕断丝连,有着难以割舍的关系--当然,如果不该割的割了,就要出大问题了,你懂的--,这其中,配置文件起着决定性的调度作用,模块与模块的沟通协作,可以说,是靠着配置文件实现的.

问题是什么呢?由于需要去不同的客户处安装我们的系统,而每个客户的具体环境又是不同的,诸如IP,端口等基本设置就要进行批量修改,如果没有合适的工具或命令帮我们完成这件事情,该是多么痛苦的体力活啊!当然了,我们可以在windows下用UE或神马编辑器批量打开所有配置文件(*.ini),然后全文替换,但是一般情况下我们是需要在客户处现场修改的,想想一种场景:当一切就绪,准备把所有安装包上传到服务器安装之前,先对客户说:稍等!我需要知道你们机器的ip,我现在windows下改好再上传安装..客户此时的表情该有多么古怪..在客户眼里,你被想当然赋予一个无敌的角色,任何问题都是可以解决的,所以..经历过用VI一个一个打开配置文件修改IP的本人来说,必须痛下决心解决这个问题.

首先,假设我们只有3个文件(无论多少都大同小异哈),a.ini,b.ini,c.ini,他们在磁盘中存放的位置关系如下:

base-dir/

/------1/

/-----11/

/------a.ini

/-----12/

/------b.ini

/------2/

/------------c.ini

三个文件的内容类似,以a.ini举例:

$ cat a.ini

[a.ini]

SELF_IP=10.253.46.98:6008

NODE_ID=50001

SERVER_IP=10.253.46.97:6007

...

我们的目标是替换掉每个a.ini的SELF_IP为192.168.14.38

先说解决办法:

# 切换到包含所有待修改文件的根目录

$ cd base-dir

# 用find命令过滤所有待修改文件,然后调用sed行编辑器批量替换

$ find ./ -name *.ini -exec sed -i "s/10.253.46.98/192.168.14.38/g" {} /;

# 看一下是不是都改好了

$ find ./ -name *.ini -exec grep -H 'SELF_IP=' {} /;

./1/11/a.ini:SELF_IP=192.168.14.38:6008

./1/12/b.ini:SELF_IP=192.168.14.38:6008

./2/c.ini:SELF_IP=192.168.14.38:6008

# 如果还是不放心,再确认一下

$ find ./ -name *.ini -exec grep -H '192.168.14.38' {} /;

./1/11/a.ini:SELF_IP=192.168.14.38:6008

./1/12/b.ini:SELF_IP=192.168.14.38:6008

./2/c.ini:SELF_IP=192.168.14.38:6008

# 大功告成

有关解释:

上例中我们使用了三个主要命令:find,sed和grep.由于都是很常见的命令,我就不把man手册对它们的详细用法翻译过来咯,只对本例的用法稍作解释,已经对这个小技巧了熟于胸的童子可以略过后面的内容.

1.find ./ -name *.ini -exec sed -i "s/FROM/TO/g" {} /;

这句话的含义是在当前目录(./)查找名字(-name)匹配*.ini的所有文件,然后将这个结果集合传递给(-exec是execute简称)sed 进行处理,后面的{} /;是固定格式.sed -i "s/FROM/TO/g" filename 表示对给定文件进行全局替换(g保证了这一点,如果不加g,那么如果同一行有多个匹配,只会替换第一个),查找FROM字符串替换为TO字符串,-i参数表示即时修改(in-place),如果不加的话,也会替换掉相应内容,但不会修改文件本身,结果是在屏幕输出替换后的文件内容,可以重定向到其他地方保存起来,有点类似于"另存为"的概念.

2.find ./ -name *.ini -exec grep -H '192.168.14.38' {} /;

类似的,这句话是说查找所有*.ini的内容中有无匹配字符串'192.168.14.38'的行,如果有,连同文件名(-H参数)一起打印出来.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: