免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lifayi2008
打印 上一主题 下一主题

[文本处理] sed中 n命令的疑惑 [复制链接]

论坛徽章:
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
41 [报告]
发表于 2014-07-03 10:47 |只看该作者
为毛引用不过来,直接复制好了


回复 29# lifayi2008


首先,他只是"从功能"上说的。

其次,例子里面也没有说明不会到BOTTOM。

我是从内部的执行流程来说的,当然这是我的理解。没有直接的文档支持。

info 说"如果没有关闭自动打印,n就输出模式空间的内容……"。
是不是等于说n的打印是自动打印?
这应该是可以找到的最“权威"的文档了,但也不直接。

另外,如果没有下一行,n会结束整个脚本,而不会执行n的后续命令。这也是我认为
n跳到BOTTOM的"理由"之一。

thanks

论坛徽章:
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
42 [报告]
发表于 2014-07-03 10:54 |只看该作者
说n命令不会自动打印,但是会改变控制流跳到bottom,这也能解释“最后一行的问题”,blockold说的应该没错

thanks回复 36# ly5066113


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
43 [报告]
发表于 2014-07-03 10:56 |只看该作者
回复 35# blackold


但也无法证明 n 会改变控制流。

我们可以看一下其他有控制流改变的命令的描述,如:
       b label
              Branch to label; if label is omitted, branch to end of script.

       d      Delete pattern space.  Start next cycle.

我认为 n 如果真的会改变控制流,那么它应该这样描述:

       n      Branch to end of script, then start next cycle, and skip all commands before n command.


至于“n会结束整个脚本,而不会执行n的后续命令。”这个说可以改变控制流我是赞同的。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
44 [报告]
发表于 2014-07-03 11:09 |只看该作者
回复 43# ly5066113


但也无法证明 n 会改变控制流。


对,这也不能直接证明n 会改变控制流。

但综合其它现象,我还是倾向于n会改变控制流,n会跳到BOTTOM。

我觉得这符合程序设计的原理(尽管我也不懂这些,如果我来写sed ,我会这样考虑)。

哪一种理解(解释),只要自圆其说就可以接受。

求同存异吧。等发现更直接的证据再说。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
45 [报告]
发表于 2014-07-03 11:22 |只看该作者

sed什么时候会结束整个脚本?

除了q/Q等显式退出的命令外,其它命令都是在尝试读下一行失败时才退出整个脚本,最后
的出口应该都是TOP/BOTTOM。这样设计起来统一且简单。(个人理解)

q也有类似n的打印功能,如果认为n有打印功能,也应该认为q也有打印功能。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
46 [报告]
发表于 2014-07-03 11:23 |只看该作者
回复 44# blackold


如果说 n 真的会改变控制流,那么 sed 在开始一个新的 cycle 的时候,就需要判断,这个新 cycle 是不是由 n 开始的。
如果是 n 开始的,就要跳过 n 前面的命令,否则就全部执行。
感觉这样设计不是很合理,仅仅为了一个 n 命令就对所有的 cycle 加一次判断。


我更倾向于这样:
所有的功能点都是以函数的形式存在的,在需要的时候加以调用。
假设,打印功能就是函数 print()

自动打印  print()
n 命令     print(); read()

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
47 [报告]
发表于 2014-07-03 11:28 |只看该作者
回复 46# ly5066113


    对,我觉得就在每个cycle的TOP处判断。不只是n,所有命令都这样。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
48 [报告]
发表于 2014-07-03 11:35 |只看该作者
回复 46# ly5066113


   Tim, 我们知道sed/awk都有既定的设计模型,既然这样,在cycle的端点TOP/BOTTOM做判断也合
乎情理啊。

  

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
49 [报告]
发表于 2014-07-03 11:36 |只看该作者
Tim,  好,不讨论,先保留各自的理解,以后再说。

论坛徽章:
0
50 [报告]
发表于 2014-07-03 11:40 |只看该作者
本来用白话很简单就可以描述清楚的东西,引入了控制流、BOTTOM等术语后,描述起来困难了许多……

默认情况下,当一行数据“处理完了”以后,将其打印出来,若开启-n,则不打印。
n,结束当前行数据的处理,认为其“处理完了”,读入下一行数据,继续处理。

这个“处理完了”用控制流之类的术语应该怎样表述?

如果用BOTTOM表示“处理完了”,那么n大概可以这样表述:
n,跳到BOTTOM,再跳回来并读入下一行数据,然后继续执行当前控制流。

末行n之后结束的原因大概是这样:
锁定技,读入下一行数据失败时,认为当前文件已处理完毕,故结束对其的处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP