免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed手册问题:使文件内连续的空白行成为一个空白行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-28 17:32 |只看该作者 |倒序浏览
sed -e '/^$/{
> N
> /^$/D
> }' test


这个是sed手册里的一个示例,作用是想使文件内连续的空白行成为一个空白行,

我的理解:
先用/^$/判断是否为空行,若是空行,则用N读入下一行到模式空间,再用/^$/判断这两行是否都为空(在多行模式中,特殊字符"^"和"$"匹配的是模式空间的最开始与最末尾,而不是内嵌"\n"的开始与末尾),若为空,则用D删除第一个空白行,再继续执行N,/^$/D,如此循环,直到/^$/判断出两行不为空时,说明N读取的下一行不为空,则不执行D,直接跳出。再用第一个/^$/来匹配文件中的空白行。



但我试了下这个脚本,不起作用,但就我自己的理解又是正确的,大牛们帮忙看看哈,哪里有问题?

论坛徽章:
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
2 [报告]
发表于 2014-06-28 18:18 |只看该作者
回复 1# qmac


    哪来的例子?

论坛徽章:
1
巨蟹座
日期:2014-06-10 23:03:47
3 [报告]
发表于 2014-06-28 18:29 |只看该作者
  1. sed -e '/^$/{N;/^\n$/D}'
复制代码
应该是这样吧?

论坛徽章:
0
4 [报告]
发表于 2014-06-28 23:44 |只看该作者
cu上下的一个sed使用手册.pdf
blackold 发表于 2014-06-28 18:18
回复 1# qmac

论坛徽章:
0
5 [报告]
发表于 2014-06-28 23:51 |只看该作者
可否解释下?
zhleiling 发表于 2014-06-28 18:29
应该是这样吧?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2014-06-28 23:52 |只看该作者
回复 5# qmac


用sedsed看看执行过程就懂了
  1. ./sedsed -d --hide=hold '/^$/{N;/^\n$/D}' urfile
复制代码
http://sedsed.sourceforge.net/

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
7 [报告]
发表于 2014-06-29 00:18 |只看该作者
回复 5# qmac
你俩的区别貌似就只有第二个空行的匹配条件?
应该是sed从上往下逐行扫描,扫描到一个空行的时候,把下一行拉进来和本行一起进行处理,如果第二行也匹配空行就删了一行,不为空不操作。
删除/没删除空行以后应该不是执行N吧,是继续扫描文本吧。
扫描文本和写不写N没有关系。

   

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
8 [报告]
发表于 2014-06-29 00:25 |只看该作者
for (i = 0; i < max_line; i++)
{
  if (line[i] == 空行(^$))
    if (line[++i] == 空行 (你的版本^$,他的版本带\n,^\n$))
      delete line[--i];
}

++i就是sed的N;循环靠的是for,不是++i(N);如果不满足第一个空行,N根本不走。
个人理解,请指正。

论坛徽章:
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
9 [报告]
发表于 2014-06-30 09:47 |只看该作者
回复 4# qmac


    应该是手册有误。

论坛徽章:
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
10 [报告]
发表于 2014-06-30 09:51 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP