免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2051 | 回复: 8

用sed替换的问题 [复制链接]

论坛徽章:
0
发表于 2009-08-11 16:33 |显示全部楼层
防火墙配置文件里有下面4行:

  1. ......
  2.   -A RH-Firewall-1-INPUT -p tcp -s 192.168.1.10 -j ACCEPT
  3.   -A RH-Firewall-1-INPUT -p udp -s 192.168.1.10 -j ACCEPT
  4.   -A RH-Firewall-1-INPUT -p tcp -s 192.168.1.10 -j ACCEPT
  5.   -A RH-Firewall-1-INPUT -p udp -s 192.168.1.10 -j ACCEPT
  6. ......
复制代码


现在要求把第1和第2个192.168.1.10替换成192.168.1.20,我用sed 's/192.168.1.10/192.168.1.20/1'的时候,4行全部被替换了,不知道为什么?有什么方法解决?

[ 本帖最后由 sailer_sh 于 2009-8-11 16:36 编辑 ]

论坛徽章:
0
发表于 2009-08-11 16:35 |显示全部楼层
流式处理

论坛徽章:
0
发表于 2009-08-11 16:39 |显示全部楼层
原帖由 ywlscpl 于 2009-8-11 16:35 发表
流式处理


什么意思?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
发表于 2009-08-11 16:42 |显示全部楼层

回复 #3 sailer_sh 的帖子

sed和awk都是逐行处理的,s/192.168.1.10/192.168.1.20/1是应用于每行的,将每行第一次匹配(最后面的那个1代表每行的第一次匹配)到的192.168.1.10替换成了192.168.1.20。

实现你的要求还是用awk比较方便吧:

  1. awk '{if(n<=2){sub(/192.168.1.10/,"192.168.1.20");n++}print}' urfile
复制代码

论坛徽章:
0
发表于 2009-08-11 16:43 |显示全部楼层

回复 #3 sailer_sh 的帖子

sed awk都是流编辑器,读入一行数据,运行一次语句
sed 's/192.168.1.10/192.168.1.20/1'这条语句针对每行都执行一次s/192.168.1.10/192.168.1.20/1

论坛徽章:
0
发表于 2009-08-11 16:50 |显示全部楼层
原帖由 Minsic 于 2009-8-11 16:42 发表
sed和awk都是逐行处理的,s/192.168.1.10/192.168.1.20/1是应用于每行的,将每行第一次匹配(最后面的那个1代表每行的第一次匹配)到的192.168.1.10替换成了192.168.1.20。

实现你的要求还是用awk比较方便吧 ...


这条命令无效,因为这4行并不是文件的头4行,是在文件中间的。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
发表于 2009-08-11 16:55 |显示全部楼层
原帖由 sailer_sh 于 2009-8-11 16:50 发表


这条命令无效,因为这4行并不是文件的头4行,是在文件中间的。


哦,我明白了 -___-  是我写错了,sorry ,试试这个:

  1. awk '/192\.168\.1\.10/&&n<2{sub(/192\.168\.1\.10/,"192.168.1.20");n++}1' urfile
复制代码

[ 本帖最后由 Minsic 于 2009-8-11 17:01 编辑 ]

论坛徽章:
0
发表于 2009-08-11 16:58 |显示全部楼层

回复 #1 sailer_sh 的帖子

awk 'NR>=2{  gsub(/192\.168\.1\.10/,"192.168.1.12");print }'

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2009-08-11 17:00 |显示全部楼层
try:
  1. awk 'i<2{i+=sub(/192\.168\.1\.10/,"192.168.1.20")}1' urfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP