Chinaunix

标题: sed手册问题:使文件内连续的空白行成为一个空白行 [打印本页]

作者: qmac    时间: 2014-06-28 17:32
标题: sed手册问题:使文件内连续的空白行成为一个空白行
sed -e '/^$/{
> N
> /^$/D
> }' test


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

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



但我试了下这个脚本,不起作用,但就我自己的理解又是正确的,大牛们帮忙看看哈,哪里有问题?
作者: blackold    时间: 2014-06-28 18:18
回复 1# qmac


    哪来的例子?
作者: zhleiling    时间: 2014-06-28 18:29
  1. sed -e '/^$/{N;/^\n$/D}'
复制代码
应该是这样吧?
作者: qmac    时间: 2014-06-28 23:44
cu上下的一个sed使用手册.pdf
blackold 发表于 2014-06-28 18:18
回复 1# qmac

作者: qmac    时间: 2014-06-28 23:51
可否解释下?
zhleiling 发表于 2014-06-28 18:29
应该是这样吧?

作者: Shell_HAT    时间: 2014-06-28 23:52
回复 5# qmac


用sedsed看看执行过程就懂了
  1. ./sedsed -d --hide=hold '/^$/{N;/^\n$/D}' urfile
复制代码
http://sedsed.sourceforge.net/
作者: MeRcy_PM    时间: 2014-06-29 00:18
回复 5# qmac
你俩的区别貌似就只有第二个空行的匹配条件?
应该是sed从上往下逐行扫描,扫描到一个空行的时候,把下一行拉进来和本行一起进行处理,如果第二行也匹配空行就删了一行,不为空不操作。
删除/没删除空行以后应该不是执行N吧,是继续扫描文本吧。
扫描文本和写不写N没有关系。

   
作者: MeRcy_PM    时间: 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根本不走。
个人理解,请指正。
作者: blackold    时间: 2014-06-30 09:47
回复 4# qmac


    应该是手册有误。
作者: blackold    时间: 2014-06-30 09:51
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1701453
作者: qmac    时间: 2014-07-02 21:36
好东西哇 多谢分享
Shell_HAT 发表于 2014-06-28 23:52
回复 5# qmac

作者: qmac    时间: 2014-07-02 22:37
对N、D理解有误
D应该是删除第一行,不再从文件里读取下一行,而是把模式空间中余下的数据再从头执行一遍指令。
MeRcy_PM 发表于 2014-06-29 00:18
回复 5# qmac
你俩的区别貌似就只有第二个空行的匹配条件?
应该是sed从上往下逐行扫描,扫描到一个空行 ...





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2