免费注册 查看新帖 |

Chinaunix

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

sed --- n , N [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-08-03 11:31 |只看该作者
原帖由 eeeef 于 2008-8-3 10:59 发表
对于sed种的t,我从来没有使用过,也不大清楚,所以就不班门弄斧了。
       t label
              If  a  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.


t 命令怎么用呢?不是太清楚

论坛徽章:
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
22 [报告]
发表于 2008-08-03 11:38 |只看该作者
原帖由 爱知 于 2008-8-3 10:47 发表

sed 真强大!!!

照以上推:sed可以实现顺序,条件,循环三种控制结构

sed是图灵完备的。So,理论上可以完成一切可计算的问题。
http://sed.sourceforge.net/grabbag/scripts/turing.sed

论坛徽章:
0
23 [报告]
发表于 2008-08-03 11:44 |只看该作者
我贴个例子让大家看看,不过我不明白其中的原理

  1. 123456 345678 2005.05.06 123456
  2. 123456 234567 2003.5.6 234567
  3. 345555 987644 2003.4.23 543333
  4. 555555 999999 2004.11.5 999999

  5. 要将第四列数据变成正常的年月日,将2003.5.6 变成2003.05.06;
  6. 2003.4.23变成2003.04.23; 2004.11.5变成 2004.11.05

  7. cat file | sed -e :a -e 's/-\([0-9]\)\([- ]\)/-0\1\2/;ta'
  8. or
  9. cat file | sed 's/-\([0-9]\)-/-0\1-/; s/-\([0-9]\) /-0\1 /'
复制代码

以上是一个以前CU论坛帖子的一个例子
但是我运行时错误的
有可能使我以前复制时疏忽了
大家来改一改,探讨一下 t 命令的原理

论坛徽章:
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
24 [报告]
发表于 2008-08-03 11:52 |只看该作者
原帖由 爱知 于 2008-8-3 11:44 发表
我贴个例子让大家看看,不过我不明白其中的原理

123456 345678 2005.05.06 123456
123456 234567 2003.5.6 234567
345555 987644 2003.4.23 543333
555555 999999 2004.11.5 999999

要将第四列数据变成 ...


echo '123ab' | sed ':a;s/[0-9]//;ta'

简单的说,就是如果 t 命令前面的 s 命令,进行了替换,那么就跳转到 t 所指的标签处,如果标签没有指定,就跳转到脚本的结束。

论坛徽章:
0
25 [报告]
发表于 2008-08-03 12:09 |只看该作者
原帖由 ly5066113 于 2008-8-3 11:52 发表


echo '123ab' | sed ':a;s/[0-9]//;ta'

简单的说,就是如果 t 命令前面的 s 命令,进行了替换,那么就跳转到 t 所指的标签处,如果标签没有指定,就跳转到脚本的结束。

t 命令好像是汇编语言里的jmp命令,有没有办法控制他的循环呢?
是这样吗?

  1. $echo "123abc"|sed ':a;s/[0-9]//;/^3/tb;ta;:b'
  2. 3abc
  3. $
复制代码

还有没有其他的办法?

论坛徽章:
0
26 [报告]
发表于 2008-08-03 12:11 |只看该作者

回复 #24 ly5066113 的帖子

简单的理解了一下

论坛徽章:
0
27 [报告]
发表于 2008-08-03 13:36 |只看该作者
原帖由 eeeef 于 2008-8-3 10:56 发表


对,再补充一下,刚才我们说的都是条件中and的方式,下面我说说or的方式,or的方式我一般使用两种:
第一种:
seq 9 | sed -n "/9\|3/p"
注意|这个要转义。

第二种:
seq 9 | sed -n -e '/9/p' -e '/3/p'

seq 9 | sed -rn "/9|3/p"
加个-r就不用转义了,还有,我一般喜欢//!d而不是-n //p因为-n //p和其他(比如s///)组合的时候很麻烦。
sed -r '/abc/!d;s/(abc).*/\1/'
如果你用p,就麻烦了。

论坛徽章:
0
28 [报告]
发表于 2008-08-03 15:04 |只看该作者
t 命令与 s/// 结合有 s///g 的功能

论坛徽章:
0
29 [报告]
发表于 2008-08-03 15:13 |只看该作者
但 t 命令控制循环的方式只有利用自身来跳出循环吗?
利用 q, Q 命令来跳出,但结束了sed

论坛徽章:
0
30 [报告]
发表于 2008-08-03 15:47 |只看该作者

回复 #29 爱知 的帖子

这个命令使用的极少,实用性不高。还是别琢磨了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP