免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于sed命令的 n选项打印模式空间很不理解!--解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-12 14:09 |只看该作者 |倒序浏览
本帖最后由 taoyantu 于 2014-12-12 14:46 编辑

找了一下别人的例子看了一下,加上n后,读取了下一行到模式空间后处理。再次执行原始文件的时候,读入的行应该是跳行的内容了,而不是针对原始文件,再一行一行处理了。。


各位好,有个问题想问一下,主要问题!!!!!在于为什么结果不是把1以下的内容都打印两边,而2,3,4这些数字只打印了一边。
我的原始文件内容是
sedceshi文件内容
1
a
2
b
3
c
4
d
5
e

使用$ sed  'n;p' sedceshi   的结果如下。
1
a
a
2
b
b
3
c
c
4
d
d
5
e
e

我的理解和结果不太一样,谁帮忙解答一下,我的理解如下
读入第一行的工作(读入1):    执行n 命令,打印1,清空模式空间,读入下一行a,因为有p ,所以再打印出a
总结果是
1
a

读入第二行的工作(读入a):      执行n 命令,打印a,清空模式空间,读入下一行2,因为有p ,所以再打印出2
总结果是
1
a
a
2

读入第三行的工作(读入2):      执行n 命令,打印2,清空模式空间,读入下一行b,因为有p ,所以再打印出b
总结果是
1
a
a
2
2
b

可是为什么结果和我理解的不一样呢?这个n应该怎么理解呢?请各位指点一下。谢谢。

论坛徽章:
0
2 [报告]
发表于 2014-12-12 14:13 |只看该作者
请大神们来帮忙解释一下啊!!!!

论坛徽章:
0
3 [报告]
发表于 2014-12-12 14:24 |只看该作者
本帖最后由 tasteoftime_90 于 2014-12-12 14:26 编辑

n是读入下一行并把模式空间输出,在p执行后到达命令行底部,会把a输出~回复 2# taoyantu


   

论坛徽章:
0
4 [报告]
发表于 2014-12-12 14:28 |只看该作者
回复 2# taoyantu

好好看看sed的帮助文档吧:
n
If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then sed exits without processing any more commands.

因为你没有用-n开关关闭auto-print,所以每次模式空间清空之前会默认打印一次里面的内容。读入1->遇到n,打印1,读入下一行a替换模式空间当前内容->遇到p,打印a->默认打印一次a->清空模式空间,读入下一行2.......

论坛徽章:
0
5 [报告]
发表于 2014-12-12 14:31 |只看该作者
回复 4# Looiml


    是啊。。我知道没带-n选项,会默认打印一次啊。你看我的第三次读入,为什么不再打印一次2呢?我执行的结果,只打印了一个2啊。。。

论坛徽章:
0
6 [报告]
发表于 2014-12-12 14:33 |只看该作者
  1. [try@KeepTry try]$ sed ':a;n;p;ba;b' 3
  2. 1
  3. a
  4. a
  5. 2
  6. 2
  7. b
  8. b
  9. 3
  10. 3
  11. c
  12. c
  13. 4
  14. 4
  15. d
  16. d
  17. 5
  18. 5
  19. e
  20. e
  21. 按你思路其实应该是改变了流程控制,例如上面这样~
复制代码
回复 3# tasteoftime_90


   

论坛徽章:
0
7 [报告]
发表于 2014-12-12 14:38 |只看该作者
回复 6# tasteoftime_90


    能告诉我一下,我的理解再哪里不对吗?能不能指点一下我理解错误的最关键的地方在哪里?您给的例子,我更不能理解了。。能先说说我的例子吗?谢谢了

论坛徽章:
0
8 [报告]
发表于 2014-12-12 14:47 |只看该作者
按我自己的理解是p执行以后,到达命令行底部,a就会被输出,重新读入新的一行并从命令行头部重新开始回复 7# taoyantu


论坛徽章:
0
9 [报告]
发表于 2014-12-12 14:54 |只看该作者
回复 7# taoyantu
n读入第2行并且处理过后,下一次处理就从第3行开始了,这就是你不知道的关键的地方。

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
10 [报告]
发表于 2014-12-12 14:59 |只看该作者
我大概明白你的意思了
按你的理解是应该得到
1
a
a
2
2
b
b
...

你这里不加-n选项,-n的意思是
-n, --quiet, --silent
                 suppress automatic printing of pattern space
抑制自动打印模式空间的内容
我的理解是这样的
先读入1,模式空间为1,然后执行n命令读入下一行,这是会输出1,模式空间变成a,然后执行p命令输出一个a,但是此时的模式空间还是a,你没有-n选项会默认再输出一次模式空间的内容,所以还会打印一次a
然后继续下面的循环,读入2,执行n,输出2,执行p输出b,无-n再一次输出b
。。。
。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP