免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6071 | 回复: 22
打印 上一主题 下一主题

[文本处理] sed读取配置批量替换 [复制链接]

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-21 16:32 |只看该作者 |倒序浏览
本帖最后由 代号:军刀 于 2013-11-21 17:42 编辑

现在有一个配置文件config,里面的内容为:
<SERVERID> 1
<SERVER_NAME> aaaaa
... ...
还有很多类似于上面的这种定义
.
.

我需要把dir目录下所有的文件,比如a.txt内容为
1
2
3
SERVERID=<SERVERID>
4
给替换成
1
2
3
SERVERID=1
4

b.txt的内容为
5555
<SERVERID>
<SERVER_NAME> fdsaf

给替换成
5555
1
aaaaa fdsaf

就是有关dir目录下的所有文件都按config文件定义的做替换,我之前使用的是傻瓜式的写法,变量定义所有config的内容,然后find查找,接着sed和-e连成一串替换,这样不好的地方在于每次我config增加一条内容,那我就得改脚本增加一个变量和一条sed,shell的数组又不支持像awk那样使用下标进行存储。不知大家有没有更好的方案,不要一个个定义config文件的变量,但替换效率也要高一点的

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2013-11-21 17:07 |只看该作者
find命令你根据实际情况改改:
  1. [root@localhost ~]# head test/*
  2. ==> test/a <==
  3. <a>

  4. ==> test/b <==
  5. <b>

  6. ==> test/c <==
  7. <c>
  8. [root@localhost ~]# cat t
  9. <a> 1
  10. <b> 2
  11. <c> 3
  12. [root@localhost ~]# find /root/test -type f | xargs awk 'NR==FNR{a[$1]=$2;next}$0 in a{$0=a[$0]}{print > FILENAME}' t
  13. [root@localhost ~]# head test/*
  14. ==> test/a <==
  15. 1

  16. ==> test/b <==
  17. 2

  18. ==> test/c <==
  19. 3
  20. [root@localhost ~]#
复制代码

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
3 [报告]
发表于 2013-11-21 17:22 |只看该作者
回复 2# yestreenstars


    你这种不行呀,你使用的是$0 in a,我都不知道替换的字符在行的哪个位置,你这个是要替换的字符都是把它当成是一行,比如替换字符在 a <a> b,那你使用$0 in a就不生效了

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2013-11-21 17:27 |只看该作者
回复 3# 代号:军刀
还有什么状况?
  1. [root@localhost ~]# head test/*
  2. ==> test/a <==
  3. 1
  4. 2
  5. 3
  6. <SERVERID>
  7. 4

  8. ==> test/b <==
  9. 5555
  10. <SERVERID>
  11. <SERVER_NAME> fdsaf
  12. [root@localhost ~]# cat t
  13. <SERVERID> 1
  14. <SERVER_NAME> aaaaa
  15. [root@localhost ~]# find /root/test -type f | xargs awk 'NR==FNR{a[$1]=$2;next}{for(i=1;i<=NF;i++)if($i in a)$i=a[$i]}{print > FILENAME}' t
  16. [root@localhost ~]# head test/*
  17. ==> test/a <==
  18. 1
  19. 2
  20. 3
  21. 1
  22. 4

  23. ==> test/b <==
  24. 5555
  25. 1
  26. aaaaa fdsaf
  27. [root@localhost ~]#
复制代码

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
5 [报告]
发表于 2013-11-21 17:32 |只看该作者
回复 4# yestreenstars


    还真有状况,你使用的是for(i=1;i<=NF;i++)   $i in a
    我要替换的文件里面存着类似server_name=<server_name>这个时候你的$1 in a又匹配不到,还是sed稳妥点,awk漏洞百出

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
6 [报告]
发表于 2013-11-21 17:34 |只看该作者
回复 5# 代号:军刀


    事实上你原来的方法不就挺好的么

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2013-11-21 17:36 |只看该作者
回复 5# 代号:军刀
没办法,我是根据你给的数据写的~

   

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
8 [报告]
发表于 2013-11-21 17:38 |只看该作者
回复 6# 关阴月飞


    原来的方法每次更改config文件,我都要改脚本,congfig增加的多,脚本我也要改得多,config的内容增多,我每次都要定义变量,造成了脚本也看起来臃肿

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
9 [报告]
发表于 2013-11-21 17:41 |只看该作者
回复 7# yestreenstars


    好吧,我的错

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
10 [报告]
发表于 2013-11-21 17:42 |只看该作者
回复 8# 代号:军刀


    但是这个config文件是替换的依据,维护这个文件也是不可避免的,如果不通过这种方式,能有别的方法自动生成这个文件不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP