免费注册 查看新帖 |

Chinaunix

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

大师系列之三 sed的三种语句 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-26 17:47 |只看该作者 |倒序浏览
本帖最后由 渣渣鸟 于 2010-06-01 15:44 编辑

sed的语句

当了解了一些sed基本知识,以及sed的一些action之后。觉得自己已经懂得sed了,结果一到应用的时候,发现就算是简单的sed语句还是写不出来。
为啥呢,因为sed是一种语法比较独特的语言,语句表达方面和c, c++, python等等大不相同。

sed语言独特在什么地方呢?且待大师慢慢道来。

一门计算机语言,无非三种语句,顺序,条件判断,循环。sed表达这三种语句的方式,典型地,和C语言是有一些差距的。
C语言很明显,顺序语句,if else条件判断,for / while 循环。
而sed语言,则显得比较随意,没有明确的关键字。但是实质是一样的。

首先理解sed的顺序语句,在C语言中sed语句是很明显的。但是在sed中则不然,对于刚接触sed的人来说,甚至有点古怪。
比如语句
sed ' {
        y/abcdef/ABCDEF/
        N
        s/\n/ /
}'
显然是,先执行y/abcdef/ABCDEF/,再执行N,再执行s/\n/ /,然而,很多人喜欢将所有语句写在一行,所以看起来不容易区分。
又比如
# 显示包含“AAA”“BBB”或“CCC”的行
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d  
对于每一次循环,都要逐个执行4条语句。
对于顺序语句,需要注意以下三种情况
1: 对于action a i 等,因为插入多行需要用“\”续行符,不太容易区分哪些是语句,哪些是文本,需要小心。
2:理解sed中的标签,也就是t T b的用法,这会影响到sed语句的执行顺序。
可以参见大师的另外一篇:http://bbs.chinaunix.net/viewthread.php?tid=1650976
3: 对于action d,也会影响到多个语句的执行顺序,man sed中提到:  d Delete pattern space.  Start next cycle.
          action D:  Delete up to the first embedded newline in the pattern space.  Start next cycle, but skip reading from the input if there is still data in the pattern space.

sed的条件判断语句,sed没有明显的if else关键字,条件判断,都是通过正则表达式匹配实现的,也就是/pattern/。这个
看起来很简单,但是没有理解的话到实战的时候往往写不出来。比如,写一个语句,实现如果本行匹配2,则打印AA,如果不匹配,
则打印BB。能独立写出来,应该就掌握了if else。这个同时也涉及正则表达式的掌握。
条件判断的否定,一是/pattern/,一是/^pattern/,还有/pattern/!,以及/pattern/t, /pattern/T  。

sed的循环,基本上都是通过标签实现。
比如
# 移除大部分的HTML标签(包括跨行标签)
sed -e :a -e 's/<[^>]*>//g;  /</N;//ba'
还有一个影藏的,就是action d 和 action D。特别是action D。如果pattern space中data不为空,则它会导致反复循环操作pattern space中的数据。
典型的组合用法是, /pattern/action; P; D;

至于复杂的逻辑,需要复杂的if和while组合实现,那是编程本身的问题,和具体语言无关。

理解了如何写sed的三种语句,加上先前对sed的两种空间和各个action比较了解,那么sed基本上就能达到应用级的水平了。


附:写完了,忽然发现很简单,似乎没说什么有用的东西,见笑。

论坛徽章:
0
2 [报告]
发表于 2010-05-26 21:04 |只看该作者
支持写心得

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2010-05-26 21:13 |只看该作者
很长时间没看到大师系列了
期待更多内容

论坛徽章:
0
4 [报告]
发表于 2010-05-26 21:33 |只看该作者
来支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP