免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3483 | 回复: 7

[文本处理] 关于sed多行删除命令的问题 [复制链接]

论坛徽章:
0
发表于 2015-07-03 17:30 |显示全部楼层
sed多行删除命令的问题:
以下举例:
[root@RHEL57 chapter20]# cat data5_test
(这是一个空白行)
This is the header line.
[root@RHEL57 chapter20]#

data5_test中只有两行,一行为空行,另一行内容:This is the header line.


现在运行以下命令:
[root@RHEL57 chapter20]# sed '/^$/N;/header/D' data5_test
[root@RHEL57 chapter20]#

实机运行结果为无显示。(就是两行全删了)

个人认为运行结果是:一个空行。

/header/D  就是把This is the header line.删了,对吧。那应该还保留空行呀。

求解答

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
发表于 2015-07-03 18:09 |显示全部楼层
这个问题有意思,先下班了

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
发表于 2015-07-03 18:21 来自手机 |显示全部楼层
第一行时,匹配了空行,执行N,结果是:\nThis line
这时匹配/header/,D删除了\n,结果是:This line
然后从头再开始,匹配空行,没搞到;再匹配header,执行D删除了整行,所以输出为空。

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2015-07-03 18:27 |显示全部楼层
本帖最后由 lifayi2008 于 2015-07-03 18:29 编辑

仔细阅读sed manpage

D命令会删除模式空间第一个换行符之前的内容,不会读入新的内容,并且回到脚本开始处处理模式空间内容
  1.   D      If pattern space contains no newline, start a normal new cycle as if the d command was issued.  Otherwise, delete text in the pattern space
  2.               up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
复制代码

论坛徽章:
0
发表于 2015-07-04 13:30 |显示全部楼层
回复 4# lifayi2008


感谢

   

论坛徽章:
0
发表于 2015-07-04 13:31 |显示全部楼层
回复 3# hjfeng1988


    感谢

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
发表于 2015-07-04 21:52 |显示全部楼层
  1. PATT:$
  2. HOLD:$
  3. COMM:/^$/ N
  4. PATT:\nThis is the header line.$
  5. HOLD:$
  6. COMM:/head/ {
  7. COMM:D
  8. PATT:This is the header line.$
  9. HOLD:$
  10. COMM:/^$/ N
  11. PATT:This is the header line.$
  12. HOLD:$
  13. COMM:/head/ {
  14. COMM:D
复制代码
lifayi说的很对

论坛徽章:
11
程序设计版块每日发帖之星
日期:2015-09-09 06:20:00CU十四周年纪念徽章
日期:2016-05-16 11:11:112016科比退役纪念章
日期:2016-05-04 17:16:57程序设计版块每日发帖之星
日期:2016-02-20 06:20:00程序设计版块每周发帖之星
日期:2015-11-06 19:30:58程序设计版块每日发帖之星
日期:2015-09-12 06:20:00程序设计版块每日发帖之星
日期:2015-09-11 06:20:00每日论坛发贴之星
日期:2015-09-10 06:20:00程序设计版块每日发帖之星
日期:2015-09-10 06:20:00每日论坛发贴之星
日期:2015-09-09 06:20:0015-16赛季CBA联赛之四川
日期:2016-12-15 15:52:10
发表于 2015-09-06 17:02 |显示全部楼层
回复 3# hjfeng1988


    学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP