免费注册 查看新帖 |

Chinaunix

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

用sed去处文件中的空行的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-20 22:17 |只看该作者 |倒序浏览
sed ':a;/^\n*$/{N;ba};s/\n*//'  去除文件中的空行,
可是我改变了以下  sed ':a;/^\n*$/{N;ba};s/\n*/g/'会在每一行的行首加上g
不明白,有高手可以解释下吗?
s/\n*/g/   不应该在每行首做替换啊!

论坛徽章:
0
2 [报告]
发表于 2009-05-20 22:54 |只看该作者

请问前面的那些是干什么用的?
a;/^\n*$/{N;ba}

论坛徽章:
0
3 [报告]
发表于 2009-05-20 23:08 |只看该作者
如果匹配到空行的话就执行N, 即读入下一行到模式空间,一直执行直到把所有的空行读入到模式空间
然后执行后面的语句,即删除空行.

[ 本帖最后由 树上开花 于 2009-5-20 23:09 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-20 23:14 |只看该作者
我理解错了你的意思

那单s/\n*/g/是什么结果?

[ 本帖最后由 haimming 于 2009-5-20 23:20 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-05-20 23:59 |只看该作者
原帖由 树上开花 于 2009-5-20 22:17 发表
sed ':a;/^\n*$/{N;ba};s/\n*//'  去除文件中的空行,
可是我改变了以下  sed ':a;/^\n*$/{N;ba};s/\n*/g/'会在每一行的行首加上g
不明白,有高手可以解释下吗?
s/\n*/g/   不应该在每行首做替换啊!


其实这样就ok了:sed  '/^$/d' file

论坛徽章:
0
6 [报告]
发表于 2009-05-21 00:38 |只看该作者

回复 #1 树上开花 的帖子

楼主这个处理挺有意思,不过想复杂了。sed '/^$/d'就能达到一样的效果,何必这样N那样s呢~

sed ':a;/^\n*$/{N;ba};s/\n*/g/'在行首加g的原因:
匹配不到/^\n*$/时,直接执行s/\n*/g/,当前pattern space里没有\n,因此s/\n*/g/的效果即s//g/,即在第一个字符前添加'g',如果修改成s/\n*/g/g,可能你能看的更清楚一些,效果就是每隔一个字符添加一个g。
第一次匹配到/^\n*$/时,其实就是匹配到了/^$/,将下一行追加到pattern space,循环,直到下一行为非空行,假设是两行空行,一行非空行,此时pattern space里的内容是"\n\nxxxxx",前面两个\n是N命令添加的,s/\n*/g/,替换的是pattern space内容里最前面的"\n\n"。

我觉得如果楼主能把N之后pattern space里的内容是什么搞清楚,就能明白为什么行首会被替换为g了。:)

论坛徽章:
0
7 [报告]
发表于 2009-05-21 00:43 |只看该作者
谢谢大牛!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP