免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
51 [报告]
发表于 2014-07-03 11:41 |只看该作者
回复 49# blackold


嗯,就像你说的,等找到无法解释的命令的时候在说吧。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
52 [报告]
发表于 2014-07-03 18:05 |只看该作者
本帖最后由 yinyuemi 于 2014-07-03 18:07 编辑

@ly5066113@blackold
恶补了下sed

下载了sed-4.2.2的source code看了看, 附件中把后缀tar改成c

sed.c
case 'n':
          no_default_output = true;  # 当设置-n参数时,no_default_output 为true, 这个很重要,用于execut.c中命令 n 的执行控制,如下面的引用
          break;


execute.c
case 'n':
               if (!no_default_output)  # 如果-n设置,此条件为假,不执行,这也就是为什么sed -n n,没有输出的原因
                output_line(line.active, line.length, line.chomped, &output_file);
              if (test_eof(input) || !read_pattern_space(input, vec, false))
                return -1;
              break;
              
case 'p':  
              output_line(line.active, line.length, line.chomped, &output_file);   # 注意 命令p是不受no_default_output控制的
              break;

if (!no_default_output)    # 此处为全局的判断,即所有命令执行结束之后(t,b等有branch功能的命令除外),判断是否执行print,即auto-print功能
      output_line(line.active, line.length, line.chomped, &output_file);
    return -1;
            


这样看来,n还是有print功能的,并且受到参数-n的控制

execute.tar

46.79 KB, 下载次数: 3

sed.tar

8.63 KB, 下载次数: 2

论坛徽章:
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
53 [报告]
发表于 2014-07-03 18:18 |只看该作者
本帖最后由 lifayi2008 于 2014-07-03 18:42 编辑

大神     case外面还有个while循环
那是否就如tim所言?n未改变控制流?回复 52# yinyuemi

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
54 [报告]
发表于 2014-07-03 18:55 |只看该作者
回复 52# yinyuemi

那auto-print是调用什么函数?
   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
55 [报告]
发表于 2014-07-03 19:32 |只看该作者
回复 53# lifayi2008


    从源码看,个人觉得n改变控制流只发生在末行,或 没有任何可以读入 时会改变(return -1),
   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
56 [报告]
发表于 2014-07-03 19:33 |只看该作者
回复 54# yestreenstars


我觉得是这里。。。

    if (!no_default_output)    # 此处为全局的判断,即所有命令执行结束之后(t,b等有branch功能的命令除外),判断是否执行print,即auto-print功能
      output_line(line.active, line.length, line.chomped, &output_file);
     return -1;

论坛徽章:
0
57 [报告]
发表于 2014-07-03 19:35 |只看该作者
回复 54# yestreenstars

case 'n':
               if (!no_default_output)  # 如果-n设置,此条件为假,不执行,这也就是为什么sed -n n,没有输出的原因
                output_line(line.active, line.length, line.chomped, &output_file);
              if (test_eof(input) || !read_pattern_space(input, vec, false))
                return -1;
              break;
              
case 'p':  
              output_line(line.active, line.length, line.chomped, &output_file);   # 注意 命令p是不受no_default_output控制的
              break;

if (!no_default_output)    # 此处为全局的判断,即所有命令执行结束之后(t,b等有branch功能的命令除外),判断是否执行print,即auto-print功能
      output_line(line.active, line.length, line.chomped, &output_file);
    return -1;


auto-print只是层主为默认的打印功能起的名字,执行的是黄色部分代码,条件的判断与打印函数的调用均与n中的对应部分完全类似。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
58 [报告]
发表于 2014-07-03 20:11 |只看该作者
研究这个有助于提高写sed的能力吗?结帖吧!

论坛徽章:
0
59 [报告]
发表于 2014-07-03 20:17 |只看该作者
回复 58# yestreenstars

怎么还敢说这种话,小心楼主又跳出来

lifayi2008 发表于 2014-07-02 16:59
你的sed还要恶补  回复 5# yestreenstars

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
60 [报告]
发表于 2014-07-03 20:20 |只看该作者
回复 52# yinyuemi
大神,膜拜啊。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP