免费注册 查看新帖 |

Chinaunix

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

这三个sed命令到底有什么不同 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-10 22:27 |只看该作者 |倒序浏览
第一个直接报错;第二个没有输出r b的内容;第三个是想要的结果。
诡异的是用sedsed -d看第二个和第三个输出内容完全是一样的

  1. # cat a
  2. 123
  3. 124
  4. dcd
  5. 125

  6. # cat b
  7. __aa
  8. __bb
  9. __cc

  10. # sed '/dcd/{r b;N}' a
  11. sed: -e expression #1, char 0: unmatched `{'

  12. # sed '/dcd/{r b;
  13. N}' a
  14. 123
  15. 124
  16. dcd
  17. 125

  18. # sed '/dcd/{r b
  19. ;N}' a
  20. 123
  21. 124
  22. __aa
  23. __bb
  24. __cc
  25. dcd
  26. 125
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-06-11 08:01 |只看该作者
回复 1# Estwind


你可以先创建一个名为"bb;"的文件,执行下面的,可以帮助你理解
  1. cat bb;
  2. __aa
  3. __bb
  4. __cc

  5. sed '/dcd/r bb;' aa
  6. 123
  7. 124
  8. dcd
  9. __aa
  10. __bb
  11. __cc
  12. 125

  13. sed '/dcd/r bb' aa
  14. 123
  15. 124
  16. __aa
  17. __bb
  18. __cc
  19. dcd
  20. 125

  21. sed '/dcd/{r bb;}' aa
  22. sed: -e expression #1, char 0: unmatched `{'   #显然这个是对"{}"的错误用法,应该是下面的

  23. sed '/dcd/{r bb;
  24. }' aa
  25. 123
  26. 124
  27. dcd
  28. __aa
  29. __bb
  30. __cc
  31. 125
复制代码
总结一下,sed中的r命令会把其后面的任何字符判读为文件名,直到回车符或是单引号,一般对r命令的写法有下面的几种:
  1. sed '/pattern/{r file1
  2. other cmd
  3. }' file  # 因为这里里面使用了{},所以可以添加其它命令


  4. sed '/pattern/ r file1 ' file  

  5. sed -e '/pattern/{r file1' -e 'other cmd}' file # 这里使用-e,相当于第一种用法


复制代码

论坛徽章:
0
3 [报告]
发表于 2011-06-11 08:52 |只看该作者
回复 2# yinyuemi


    学习了

论坛徽章:
0
4 [报告]
发表于 2011-06-11 16:26 |只看该作者
感谢回复,原来r命令是这样读取文件的,man里面就一句简单的“Append text read from filename.”


不过对另两个命令还没弄明白,我这里试的结果和你的不一样,后面加";"的话,不会显示r b的内容了

  1. # sed '/dcd/r b;' a
  2. 123
  3. 124
  4. dcd
  5. 125
  6. # sed '/dcd/r b' a
  7. 123
  8. 124
  9. dcd
  10. __aa
  11. __bb
  12. __cc
  13. 125


  14. 用sedsed看这两个命令的执行过程是一模一样的
  15. # sedsed -d '/dcd/r b;' a > 1
  16. # sedsed -d '/dcd/r b' a > 2
  17. # diff 1 2
  18. # cat 1
  19. PATT:123$
  20. HOLD:$
  21. COMM:/dcd/ r b
  22. PATT:123$
  23. HOLD:$
  24. 123
  25. PATT:124$
  26. HOLD:$
  27. COMM:/dcd/ r b
  28. PATT:124$
  29. HOLD:$
  30. 124
  31. PATT:dcd$
  32. HOLD:$
  33. COMM:/dcd/ r b
  34. PATT:dcd$
  35. HOLD:$
  36. dcd
  37. __aa
  38. __bb
  39. __cc
  40. PATT:125$
  41. HOLD:$
  42. COMM:/dcd/ r b
  43. PATT:125$
  44. HOLD:$
  45. 125

复制代码
回复 2# yinyuemi

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-06-11 23:22 |只看该作者
回复 4# Estwind


    你要先创建一个文件名为"b;"的文件,内容随便是什么,再执行你上面的代码,
PS. 感觉是sedsed的bug??

论坛徽章:
0
6 [报告]
发表于 2011-06-12 09:48 |只看该作者
回复 2# yinyuemi


    学习了

论坛徽章:
0
7 [报告]
发表于 2011-06-12 23:28 |只看该作者
应该是如你二楼说的那样,r把"b;"当作文件名了,实际上没有读到文件b。sedsed那个debug是有问题。多谢了,呵

回复 5# yinyuemi

论坛徽章:
0
8 [报告]
发表于 2011-06-13 01:11 |只看该作者
回复 7# Estwind


    我也疑问了很久,看到这就明白了!顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP