免费注册 查看新帖 |

Chinaunix

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

sed 段匹配 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-22 08:56 |只看该作者 |倒序浏览
有一个文本有若干段
我想删除符合以下特征的段:

1 第一种
title
fsdaf
fsdaf
空行(不删除本行)

2 第二种
title
fdsaf
fdsaf
#ded(不删除本行)

3 第三种
title
dsa
fdsf
文件结束

注: title前面可能有空格或制表符,只要符合以上特征之一的删除第一次匹配(匹配多次时)
     第一次匹配方式可能是第一种也可能是第二种,不一定,不要错误地理解为用第一种方式匹配的第一次删除
     再用第二种匹配的方式将匹配的第一次删除,而是将三种方式混合,是并集,只要匹配包含于该并集,就将第
     一次匹配删除,其余不作处理
     文件中还有其它种类的段或行,并不是只有title开头的段格式
想想都捏一把汗,不知能否用sed解

例如:
name  fdafds

# this is a file

title  mike
fdsaf
fdsaf
#ddasd

title jack
fdsf
fdsafa

处理后:
name  fdafds

# this is a file

#ddasd

title jack
fdsf
fdsafa

[ 本帖最后由 chzht001 于 2007-5-22 14:16 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2007-05-22 09:02 |只看该作者
请注意发帖标题并读新手导航,谢谢

论坛徽章:
0
3 [报告]
发表于 2007-05-22 09:37 |只看该作者
随便写了个, 貌似有些空行没有处理好...^^

  1. sed -n -r '
  2. :start
  3. /^title/{
  4. x;s:^\n::;s:\n?title$::;p;x;h;
  5. }
  6. n;
  7. /^$|^#/{
  8. x;s:.*::;x;P;
  9. b start;
  10. }
  11. H;
  12. b start;'
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-05-22 11:27 |只看该作者
写起来应该很简单,不过楼主的需求描述太混乱。^_^

论坛徽章:
0
5 [报告]
发表于 2007-05-22 11:31 |只看该作者
原帖由 woodie 于 2007-5-22 11:27 发表
写起来应该很简单,不过楼主的需求描述太混乱。^_^

同感。

论坛徽章:
0
6 [报告]
发表于 2007-05-22 12:33 |只看该作者
原帖由 woodie 于 2007-5-22 11:27 发表
写起来应该很简单,不过楼主的需求描述太混乱。^_^

同感。

论坛徽章:
0
7 [报告]
发表于 2007-05-22 14:17 |只看该作者
不知现在说的清不清楚,复杂的我都说不清了

可能这样描述会更清晰一点:
我们平常匹配段时会有如下的样子
匹配以title开头,以endtitle结尾的段
这种方式容易:
/^title/.../^endtitle/

但我现在的匹配方式是
匹配以title开头,以三种方式中的一种结尾的段
三种方式为:
空行
以#开头的行
文件尾

用sed如何描述呢?

不可以写三个表达式来做,那样会删除匹配三次,
而我只想删除,以这三种方式之一匹配的一次

以哪种方式匹配未知,但肯定是这三种中的一种,
可能有一种匹配,可能有两种匹配,也可能有三种匹配
无论第一次匹配是哪种,都将该次匹配删除,其余任何匹配无需再作处理

[ 本帖最后由 chzht001 于 2007-5-22 14:36 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-05-22 15:04 |只看该作者

  1. sed -n -r '
  2. /^title/{
  3. x;s:\n::;x;H;
  4. :read
  5. n;
  6. /^$|^#/{
  7. x;s:.*::;x;s:^\n::;p;
  8. b end;
  9. }
  10. /^title/{
  11. x;s:^\n::;p;s:.*::;x;H;
  12. b read;
  13. }
  14. H;
  15. b read;
  16. }
  17. p;
  18. :end'
复制代码


input file

  1. title
  2. fsdaf
  3. fsdaf

  4. title
  5. fdsaf
  6. fdsaf
  7. #ded

  8. title
  9. a
  10. b
  11. title
  12. c
  13. d
  14. title
  15. dsa
  16. fdsf

  17. 34213
  18. 43214
  19. 32
  20. 14
  21. 214

  22. title
  23. a
  24. b
  25. title
  26. c
  27. d
  28. title
  29. dsa
  30. fdsf
复制代码


result:


  1. #ded

  2. title
  3. a
  4. b
  5. title
  6. c
  7. d

  8. 34213
  9. 43214
  10. 32
  11. 14
  12. 214

  13. title
  14. a
  15. b
  16. title
  17. c
  18. d

复制代码

[ 本帖最后由 Edengundam 于 2007-5-22 15:15 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2007-05-22 15:36 |只看该作者
GNUsed 4.0.9,写的比较丑。^_^试试看:
sed '/title/,${0,/^$\|^#/{//p;d};}'

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2007-05-22 15:46 |只看该作者
记忆中楼主的平台好像没有GNU工具,遗憾,那样的话楼上的代码就帮不上忙了。^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP