免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2381 | 回复: 11

[文本处理] 关于匹配一段内容,修改匹配到的这一段内容中其中一行的问题 [复制链接]

论坛徽章:
1
未羊
日期:2014-02-10 15:04:47
发表于 2015-01-22 11:23 |显示全部楼层
本帖最后由 喵星人Nginx 于 2015-01-22 11:39 编辑

如下显示其中相同的配置重复出现:
  1. [DB01]
  2. IP=192.168.1.1
  3. USER=guset
  4. PASS=123456
  5. DIR=/home/guest
  6. DATE=01
  7. TIME=01
  8. ID=01

  9. [DB02]
  10. IP=192.168.1.2
  11. USER=guset
  12. PASS=123456
  13. DIR=/home/guest
  14. DATE=01
  15. TIME=01
  16. ID=01

  17. [VS01]
  18. IP=192.168.1.3
  19. USER=guset
  20. PASS=123456
  21. DIR=/home/guest
  22. DATE=01
  23. TIME=01
  24. ID=01

  25. [BS01]
  26. IP=192.168.1.66
  27. USER=guset
  28. PASS=123456
  29. DIR=/home/guest
  30. DATE=01
  31. TIME=01
  32. ID=01

  33. [DB03]
  34. IP=192.168.1.99
  35. USER=guset
  36. PASS=123456
  37. DIR=/home/guest
  38. DATE=01
  39. TIME=01
  40. ID=01
复制代码
需求是匹配到以"DB"开头的这一段内容,然后替换其中"DATE=01"这段为"DATE=02" 然后要回写到myfile里..

我现在只能匹配到 匹配到就不知道怎么做了,想过匹配到给指定的行打标记然后再修改,但是不知道怎么实现
  1. sed -n '/\[DB/,/ID=01/p' myfile
复制代码
  1. [DB01]
  2. IP=192.168.1.1
  3. USER=guset
  4. PASS=123456
  5. DIR=/home/guest
  6. DATE=01
  7. TIME=01
  8. ID=01
  9. [DB02]
  10. IP=192.168.1.2
  11. USER=guset
  12. PASS=123456
  13. DIR=/home/guest
  14. DATE=01
  15. TIME=01
  16. ID=01
  17. [DB03]
  18. IP=192.168.1.99
  19. USER=guset
  20. PASS=123456
  21. DIR=/home/guest
  22. DATE=01
  23. TIME=01
  24. ID=01
复制代码
求教各位大神

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
发表于 2015-01-22 11:31 |显示全部楼层
回复 1# 喵星人Nginx

是要这样子么
  1. sed -n 's/DATE=01/DATE=02/;/\[DB/,/ID=01/p' myfile
复制代码

论坛徽章:
1
未羊
日期:2014-02-10 15:04:47
发表于 2015-01-22 11:35 |显示全部楼层
回复 2# Buring__


    我试了下,是这样的...看你这个貌似是先替换然后再匹配啊.....

论坛徽章:
1
未羊
日期:2014-02-10 15:04:47
发表于 2015-01-22 11:39 |显示全部楼层
回复 2# Buring__


    如果用你这段回写回文件的话....就把所有其他无关的行的"DATE=01"替换成"DATE=02" 然后DB都变成两行了....

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
发表于 2015-01-22 11:39 |显示全部楼层
加个管道这样纸不就行了吗
  1. sed -n '/\[DB/,/ID=01/p' urfile|sed 's/DATE=01/DATE=02/'
复制代码

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
发表于 2015-01-22 11:41 |显示全部楼层
这样纸
  1. sed -n '/\[DB/,/ID=01/{s/DATE=01/DATE=02/;p}' urfile
复制代码

论坛徽章:
1
未羊
日期:2014-02-10 15:04:47
发表于 2015-01-22 11:55 |显示全部楼层
本帖最后由 喵星人Nginx 于 2015-01-22 11:58 编辑

回复 6# Buring__


用了
  1. sed -n '/\[DB/,/ID=01/{s/DATE=01/DATE=02/;p}' urfile
复制代码
这个以后 其他无关项不会修改了...但是匹配到的内容 也就是DB的行全部会重复两遍....
就是这个样子..
  1. [DB01]
  2. [DB01]
  3. IP=192.168.1.1
  4. IP=192.168.1.1
  5. USER=guset
  6. USER=guset
  7. PASS=123456
  8. PASS=123456
  9. DIR=/home/guest
  10. DIR=/home/guest
  11. DATE=02
  12. DATE=02
  13. TIME=01
  14. TIME=01
  15. ID=01
  16. ID=01

  17. [DB02]
  18. [DB02]
  19. IP=192.168.1.2
  20. IP=192.168.1.2
  21. USER=guset
  22. USER=guset
  23. PASS=123456
  24. PASS=123456
  25. DIR=/home/guest
  26. DIR=/home/guest
  27. DATE=02
  28. DATE=02
  29. TIME=01
  30. TIME=01
  31. ID=01
  32. ID=01

  33. [VS01]
  34. IP=192.168.1.3
  35. USER=guset
  36. PASS=123456
  37. DIR=/home/guest
  38. DATE=01
  39. TIME=01
  40. ID=01

  41. [BS01]
  42. IP=192.168.1.66
  43. USER=guset
  44. PASS=123456
  45. DIR=/home/guest
  46. DATE=01
  47. TIME=01
  48. ID=01

  49. [DB03]
  50. [DB03]
  51. IP=192.168.1.99
  52. IP=192.168.1.99
  53. USER=guset
  54. USER=guset
  55. PASS=123456
  56. PASS=123456
  57. DIR=/home/guest
  58. DIR=/home/guest
  59. DATE=02
  60. DATE=02
  61. TIME=01
  62. TIME=01
  63. ID=01
  64. ID=01
复制代码

论坛徽章:
1
未羊
日期:2014-02-10 15:04:47
发表于 2015-01-22 12:12 |显示全部楼层
回复 6# Buring__


    翻了下以前的帖子...貌似有类似的我就试了下 结果成功了...
  1. sed '/\[DB/{:1;N;/ID=01/!b1;s/\nDATE=01\n/\nDATE=02\n/}'
复制代码

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
发表于 2015-01-22 12:27 |显示全部楼层
  1. awk -v RS="[" 'NR>1{if($1~/DB/) {printf "[";print gensub(/DATE=01/,"DATE=02",$0);} else {print "["$0}}' mypfile
复制代码
回复 1# 喵星人Nginx


   

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
发表于 2015-01-22 13:30 |显示全部楼层
  1. sed  '/\[DB/,/^$/ s/DATE=01/DATE=02/' data
复制代码
要这样?每组数据是用空行分割的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP