免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed在匹配最后一次的行后增加内容 [复制链接]

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
发表于 2014-10-13 17:15 |显示全部楼层
本帖最后由 hjfeng1988 于 2014-10-14 15:29 编辑

例子:
  1. aa1
  2. bb1
  3. bb2
  4. cc1
复制代码
使得匹配bb的最后一次行后增加test,用sed如何实现,或者用awk有没有更简单一点?
  1. aa1
  2. bb1
  3. bb2
  4. test
  5. cc1
复制代码
我喜欢简单点的风格:
比如3楼yestreenstars
  1. tac file | sed '0,/bb/{//s/.*/test\n&/}' | tac
复制代码
关于两个//的解释,可通过info sed查看,本人英文瞥足,就不丢脸了。
  1.      The empty regular expression `//' repeats the last regular
  2.      expression match (the same holds if the empty regular expression is
  3.      passed to the `s' command).  Note that modifiers to regular
  4.      expressions are evaluated when the regular expression is compiled,
  5.      thus it is invalid to specify them together with the empty regular
  6.      expression.
复制代码
还有一种用sed 'i'插入的方式,找到了以下帖子http://bbs.chinaunix.net/thread-1355985-1-1.html
2楼waker
  1. sed '1,/^#include/{/^#include/i\
  2. sway2004009
  3. }' myfile
复制代码
不过带强迫感的我喜欢把命令搞到一行上面,经yinyuemi在30楼回复解决了
  1. sed -e '1,/bb/{/bb/i\test' -e'}' file
复制代码
另外几种sed的用法,看起来真是头疼呀。awk也是同样的问题,命令行过长。
对不起以上写法的诸位,实话说没有认真看你们的答复,最后,谢谢大家。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-10-13 17:38 |显示全部楼层
  1. [root@localhost ~]# cat file1
  2. aa1
  3. bb1
  4. bb2
  5. bb2
  6. bb2
  7. bb2
  8. bb2
  9. cc1
  10. [root@localhost ~]# tac file1 | awk -vn=1 '/bb/&&n==1{print $0;print  "test";n=0;next}{print  $0}' | tac
  11. aa1
  12. bb1
  13. bb2
  14. bb2
  15. bb2
  16. bb2
  17. test
  18. bb2
  19. cc1
复制代码

论坛徽章:
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
发表于 2014-10-13 17:41 |显示全部楼层
  1. [root@localhost ~]# cat i
  2. aa1
  3. bb1
  4. bb2
  5. cc1
  6. [root@localhost ~]# tac i | sed '0,/bb/{//s/.*/test\n&/}' | tac
  7. aa1
  8. bb1
  9. bb2
  10. test
  11. cc1
  12. [root@localhost ~]#
复制代码

论坛徽章:
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
发表于 2014-10-13 17:43 |显示全部楼层
http://bbs.chinaunix.net/thread-4141740-1-1.html  
这个帖子可以参考下

论坛徽章:
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
发表于 2014-10-13 17:53 |显示全部楼层
  1. [root@localhost ~]# sed -n '/bb/{${s/$/\ntest/;H;g;p;b};x;p;b};1h;1!H;${g;s/bb[^\n]*/&\ntest/p}' i
  2. aa1
  3. bb1
  4. bb2
  5. test
  6. cc1
  7. [root@localhost ~]#
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2014-10-13 17:53 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
发表于 2014-10-13 17:57 |显示全部楼层
  1. [root@localhost ~]# awk '{if(/bb/)n=NR;a[NR]=$0}END{for(i=0;i++<NR;){if(i==n)a[i]=a[i]"\ntest";print a[i]}}' i
  2. aa1
  3. bb1
  4. bb2
  5. test
  6. cc1
  7. [root@localhost ~]#
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
发表于 2014-10-13 17:58 |显示全部楼层
学生党:飘过~无聊~pyton试试

  1. $ cat yhsafe.py
  2. #!/usr/bin/env python
  3. # -*- coding:gbk -*-
  4. "just for fun ~ soso"
  5. import sys
  6. import re
  7. def re_call_back(matchobj):
  8.         return '{}\ntest'.format(matchobj.group())
  9. fd_txt=open(sys.argv[1]).read()
  10. re.findall(r'bb.*',fd_txt)[-1]
  11. print re.sub(re.findall(r'bb.*',fd_txt)[-1],re_call_back,fd_txt)
复制代码
测试:
$ ./yhsafe.py yhsafe.txt
aa1
bb1
bb2
test
cc1

论坛徽章:
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
发表于 2014-10-13 17:59 |显示全部楼层
回复 6# zooyo

采取全文读取的方式写起来是简单,但如果文本大的话就不好用了~{:3_193:}
   

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
发表于 2014-10-13 18:13 |显示全部楼层
回复 3# yestreenstars


    {//s/.*/test\n&/}
这边的两个//怎么解释,理解不了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP