免费注册 查看新帖 |

Chinaunix

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

[文本处理] Sed - 文本处理 [复制链接]

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-21 10:23 |只看该作者 |倒序浏览
我想用sed 来处理这个文件
  1. < ABC1
  2. > Hello1
  3. > Hello2
  4. < ABC2
  5. > Hello3
  6. < ABC3
  7. > Hello4
  8. > Hello5
  9. > Hello6
  10. > Hello7
复制代码
想要的结果是:
  1. ABC1.Hello1
  2. ABC1.Hello2
  3. ABC2.Hello3
  4. ABC3.Hello4
  5. ABC3.Hello5
  6. ABC3.Hello6
  7. ABC3.Hello7
复制代码
我的想法是看到 "<" 就把后面的字段保留, 看到">"后,将保留的字段连上打印,但是好像控制得不对。
  1. sed '/</{s/< //;H;ta};/>/{N;s/[><]//g;s/\([^\n]*\)\n\([^\n]*\)/\1\.\2/};:a' file
  2. Parent1
  3. Child1. Child2
  4. Parent2
  5. Child3. Parent3
  6. Child4. Child5
  7. Child6. Child7
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-05-21 10:26 |只看该作者
回复 1# newoz
不允许作弊用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
3 [报告]
发表于 2014-05-21 10:28 |只看该作者
我想用awk来处理这个问题:
  1. [root@ awktest]# cat file
  2. < ABC1
  3. > Hello1
  4. > Hello2
  5. < ABC2
  6. > Hello3
  7. < ABC3
  8. > Hello4
  9. > Hello5
  10. > Hello6
  11. > Hello7
  12. [root@ awktest]# awk '/</{a=$2;next}{print a"."$2}'  file
  13. ABC1.Hello1
  14. ABC1.Hello2
  15. ABC2.Hello3
  16. ABC3.Hello4
  17. ABC3.Hello5
  18. ABC3.Hello6
  19. ABC3.Hello7
复制代码

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
4 [报告]
发表于 2014-05-21 10:31 |只看该作者
awk我也会啊, 但是用到sed 总是控制不好。

论坛徽章:
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
5 [报告]
发表于 2014-05-21 10:39 |只看该作者
这种问题用awk来做是最简单的:
  1. awk '/^</{t=$2;next}{$0=t"."$2}1'
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-05-21 10:59 |只看该作者
回复 1# newoz
sed水平一般,请多指教。
  1. sed -n '/</{h;:1;N;/>/{s/^<\s*//;s/\s*>\s*/./;p;g;b1};/\n</D}' i
  2. ABC1.Hello1
  3. ABC1.Hello2
  4. ABC2.Hello3
  5. ABC3.Hello4
  6. ABC3.Hello5
  7. ABC3.Hello6
  8. ABC3.Hello7
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2014-05-21 11:16 |只看该作者
回复 1# newoz
  1. sed -nr ':a;$!N;s/(< ([^\n]+))\n> ([^\n]+)/\2.\3\n\1/;/\./P;D;ta'
复制代码

论坛徽章:
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
8 [报告]
发表于 2014-05-21 11:49 |只看该作者
  1. $ sed -r '/</{s/< //;h};/>/{s/> //;G;s/(.*)\n(.*)/\2.\1/p};d' i
  2. ABC1.Hello1
  3. ABC1.Hello2
  4. ABC2.Hello3
  5. ABC3.Hello4
  6. ABC3.Hello5
  7. ABC3.Hello6
  8. ABC3.Hello7
复制代码

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
9 [报告]
发表于 2014-05-21 12:08 |只看该作者
本帖最后由 newoz 于 2014-05-21 12:12 编辑
yestreenstars 发表于 2014-05-21 11:49
$ sed -r '/</{s/< //;h};/>/{s/> //;G;s/(.*)\n(.*)/\2.\1/p};d' i


这个正是我要的,完全按照我的思路。非常感谢。

我其实已经很接近了。 G 和 d 命令很有用。

我自己按照你的思路改正的。
  1. sed '/</{s/< //;h;ta};/>/{G;s/[><] //g;s/\([^\n]*\)\n\([^\n]*\)/\2\.\1/p};:a;d' file
复制代码

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
10 [报告]
发表于 2014-05-21 12:22 |只看该作者
我的命令还可以简化
  1. sed '/</{h;ba};G;s/[><] //g;s/\(.*\)\n\(.*\)/\2\.\1/p;:a;d' file
  2. sed -r '/</{h;ba};G;s/[><] //g;s/(.*)\n(.*)/\2\.\1/p;:a;d' file
复制代码
这个相当于用sed 来解决 if-then-else 的做法。 应该算是比较通用的方法,以后会有用,特地写下来。
  1. /</          #  相当于 if 的条件判断
  2. {h;ba};  # 相当于  if 的 then 后的命令
  3. G;s/[><] //g;s/(.*)\n(.*)/\2\.\1/p;    # 相当于 else后的命令
复制代码
谢谢大家,学到很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP