Chinaunix

标题: sed缓冲区里行号是不是就不是按原本的理解方式了 [打印本页]

作者: gaoshoupei    时间: 2012-03-19 16:13
标题: sed缓冲区里行号是不是就不是按原本的理解方式了
假设删除几行之后的结果如下
# sed -e '1,/value/d' file
192.168.1.1
192.168.1.2  

如果想打印删除之后第一行的结果一开始的命令写成
# sed -e '1,/value/d' -n -e '1p' file
没有任何输出

# sed -e '1,/value/d' -n -e '2p' file
没有任何输出

但是如果写成
# sed -e '1,/value/d' -n -e '1,2p' file
192.168.1.1
能打印出东西

求解释~不针对解决问题的合理性只想问下这种现象的原因
作者: hbmhalley    时间: 2012-03-19 16:26
估计lz发现bug了

  1. sh.exe"-3.1$ echo 'a
  2. > b
  3. > c' | sed -ne '1,2d;1,2p;'
  4. c
  5. sh.exe"-3.1$ echo 'a
  6. > b
  7. > c' | sed -ne '1,2d;3p;'
  8. c
复制代码

作者: gaoshoupei    时间: 2012-03-19 16:36
回复 2# hbmhalley

额,什么意思? sed本身的bug?
作者: regansong    时间: 2012-03-19 17:01
命令行下多个-e命令相当于将一个命令组应用于sed中pattern space中的每一行.
当pattern space中输入一行,第一条命令判断是否输入行是否是第一行与第一次出现value的行之间,如果是则删除pattern space中的该行输入内容,因为pattern space中没有内容了,会导致控制流回到sed命令组的顶端也即第一条命令.
这个跟多行删除D命令是不一样的意思.
因此:

  1.    输入文件:
  2.     1
  3.     value
  4.    192.168.1.1
  5.    192.168.1.2
  6.    命令:
  7.    sed -e '1,/value/d'  -ne '3p' testfile
  8.    输出:
  9.    192.168.1.1  
  10.    但:
  11.    sed -e '1,/value/d'  -ne '1,2p' testfile 无法输出你想要的结果.  
复制代码
这就是sed的处理机制,不算bug吧,个人理解,请指正.
作者: hbmhalley    时间: 2012-03-19 18:14
回复 3# gaoshoupei


    对.

回复 4# regansong


    解释下2L的'c'到底是第二行还是第三行吧
作者: nuclearxin    时间: 2012-03-19 18:16
这个d干里什么呢~~~~~
看man
d      Delete pattern space.  Start next cycle.
作者: hbmhalley    时间: 2012-03-19 18:48
回复 6# nuclearxin


    问题是 p 为什么会起作用
作者: zooyo    时间: 2012-03-19 19:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: hbmhalley    时间: 2012-03-19 19:23
回复 8# zooyo


    可事实是执行 p 了。怎么解释
作者: winway1988    时间: 2012-03-19 19:31
  1. [winway@winway test]$ cat urfile                  
  2. a
  3. b
  4. c
  5. d
  6. e
  7. f
  8. [winway@winway test]$ sed -n '1,2d;=;1,2p' urfile
  9. 3
  10. c
  11. 4
  12. 5
  13. 6
复制代码
为什么对于第三行,能满足1,2这个条件,而打印c
作者: zooyo    时间: 2012-03-19 19:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: hbmhalley    时间: 2012-03-19 20:51
回复 11# zooyo


    不懂 .. 求传送门

    还有, 2L 怎么解释?[1,2]∩[3]≠{} ?
作者: zooyo    时间: 2012-03-19 21:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: hbmhalley    时间: 2012-03-19 21:56
回复 13# zooyo


    我想弄清楚为什么居然会有东西被打印出来。1,2d;1,2p; 后面这个1,2p;不应该是废话么?
作者: zooyo    时间: 2012-03-19 23:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: blackold    时间: 2012-03-19 23:23
本帖最后由 blackold 于 2012-03-19 23:24 编辑

回复 14# hbmhalley


    不是。

对于   lineNumber1, lineNumber2 这样的地址对,如果当前行号cNumber大于等于 lineNumber1,则为视为匹配。
对于第二个数字,如果它小于或等于匹配第一个数字的行号,则只匹配一行。

当读到第3行时,当前行号为 3, 那么对于第二个 1,2p,因为3>1,所以匹配,进入地址对。
而2却小于3,所以只匹配一行,即第3行。
作者: hbmhalley    时间: 2012-03-19 23:25
回复 15# zooyo


    不明白。什么叫 `d没有执行' ?
    换句话说,怎么解释 '1,2d;1,2p;' 和 '1,2d;1p;2p;' 的结果不一样?
作者: zooyo    时间: 2012-03-19 23:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: hbmhalley    时间: 2012-03-19 23:34
回复 18# zooyo
回复 16# blackold


    多谢!懂了.
    可是这是故意设定成这样的么?无论如何都觉得1,2p打印第三行非常荒诞
作者: blackold    时间: 2012-03-19 23:36
可以参考以前的讨论

http://bbs.chinaunix.net/thread-3557086-1-1.html
作者: hbmhalley    时间: 2012-03-20 00:05
真是不懂了

  1. sh.exe"-3.1$ echo 'a
  2. > b
  3. > c' | sed '/a/,/b/{/b/d}'
  4. a
  5. c
复制代码
说明对于/a/,/b/中/b/的判断在{}开始前而非结束后,否则/b/d应当跳过对外层/b/的判断
如果是这样,那么`1,2p;' 在p生效之前就已经知道p命令结束于第二行,那么有什么理由假装不知道还要留个后门给当前行,生米煮成稀饭了才发现 `卧槽让这小子捡漏了'
作者: yinyuemi    时间: 2012-03-20 08:56
回复 19# hbmhalley


    sed的这种用法类似于perl的...操作符,叫"filp-flop"
    http://perldoc.perl.org/perlop.html#Range-Operators
作者: blackold    时间: 2012-03-20 09:24
回复 21# hbmhalley


    行号寻址和正则寻址是不同的。看下面的例子:

  1. $ cat urfile
  2. a
  3. b
  4. c
  5. d
  6. e
  7. f

  8. $ sed '1,2d;' urfile
  9. c
  10. d
  11. e
  12. f

  13. $ sed '1,2d;=' urfile
  14. 3
  15. c
  16. 4
  17. d
  18. 5
  19. e
  20. 6
  21. f

  22. $ sed '1,2d;=;1,2d;' urfile
  23. 3
  24. 4
  25. d
  26. 5
  27. e
  28. 6
  29. f

  30. $ sed '1,2d;=;1,2d;1,2d;' urfile
  31. 3
  32. 4
  33. 5
  34. e
  35. 6
  36. f


复制代码

作者: blackold    时间: 2012-03-20 09:28
回复 22# yinyuemi


    反了吧,应该说 Perl 与 sed 和 awk 相似。
作者: yinyuemi    时间: 2012-03-20 09:45
回复 24# blackold


   黑哥正解
作者: blackold    时间: 2012-03-20 10:09
本帖最后由 blackold 于 2012-03-20 10:09 编辑

回复 25# yinyuemi


    技术版就是好!拿1分再说




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