免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell 斑竹
最近访问板块 发新帖
查看: 1348 | 回复: 7
打印 上一主题 下一主题

斑竹 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-26 14:50 |只看该作者 |倒序浏览
  1. sed'
  2. /^$/{
  3. :LOOP
  4.         n
  5.         s,.,@&,
  6.         T LOOP
  7. }' urfile
复制代码

请斑竹解释下上述脚本,该脚本在如何退出loop循环?因为循环体内没有跳出语句,故一直不明白

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2007-06-26 14:55 |只看该作者
T label
              If no s/// has done a successful substitution  since  the  last
              input  line  was  read  and since the last t or T command, then
              branch to label; if label is omitted, branch to end of  script.

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2007-06-26 14:56 |只看该作者
别外建议读新手导航

论坛徽章:
0
4 [报告]
发表于 2007-06-27 10:25 |只看该作者
If no s/// has done a successful substitution  since  the  last
              input  line  was  read  and since the last t or T command, then
              branch to label; if label is omitted, branch to end of  script.
最后一行被读入后,如果没有‘s///‘语句成功进行替换操作,则跳到label,如果label被省略,则跳到script结尾。 那么上面的语句中有label,循环岂不是一直继续。
我对上面脚本理解是:匹配空格行,然后进入{}结构。执行结构中n语句读入下一行纪录,然后s,.,@&,替换刚读入的纪录,最后跳到{}结构开始处反复执行?几点疑问:
1.一共读入两行语句(正则匹配的空行以及n读入的下面一行),那么"the last input line"指的是第二行还是整个文本的最后一行。
2.第一次正则匹配后,{}的语句中的loop其什么作用,按照语义理解,好像它一直{}体内循环。

[ 本帖最后由 shizhi21cn 于 2007-6-27 10:30 编辑 ]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [报告]
发表于 2007-06-27 10:48 |只看该作者
英语阅读和逻辑思维需要补习一下^_^
1. last这里应代表上次、前次。
2. 有没有label影响跳转点,但并不决定是否跳转。
3. loop仅是一个label,如果愿意可以改为noloop,runonce或aaa
4. {}和标号、跳转指令没有特别的联系

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2007-06-27 10:54 |只看该作者
循环岂不是一直继续?这是怎么得出来的?,只要行中有任意一个字符,s/./@&/都会成功
1.使用n的时候,只有一行数据被处理,哪儿来的第二行?
2.不是一直循环
建议读新手导航

论坛徽章:
0
7 [报告]
发表于 2007-06-27 11:07 |只看该作者
r2007没明白我意思,label我知道只是个标号。标号在{}内部构成了循环,我对上述脚本的理解可表达如下:

  1. for read line; do
  2.     if [[ -z line ]]; then
  3.          :loop
  4.           read next line
  5.         if ![[ s/ / / ]]; then
  6.            go to loop
  7.         fi
  8.       fi
  9. done
复制代码

[ 本帖最后由 shizhi21cn 于 2007-6-27 11:12 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-06-27 11:17 |只看该作者
这回明白了,谢谢两位斑竹。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP