最近学习sed,发现各种书上对于标签讲的很少,所以写了篇文章,说说我的理解。
关于sed标签,在manpage中是这样说的:
b label
Branch to label; if label is omitted, branch to end of script.
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 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.
标签在sed当中的作用就是跳转。从manpage可以得知,t lable和T lable的作用是相反的,那么我们主要来看看b lable和t lable。接下来实例说明,首先,创造个文件:
[root@A ~]# cat b
The colour is red
The colour is green
The colour is black
The colour is yellow
执行以下语句:
[root@A ~]# sed '{/colour/b lable;s/colour/COLOUR/;:lable; s/$/ \!/}' b
The colour is red !
The colour is green !
The colour is black !
The colour is yellow !
我们看到,执行了sed命令后在文件的每一行后面加上了“!”,而并没有将“colour”替换成为“COLOUR”。可以看到,我们定义了一个标签lable(:lable),那么这条语句的作用就是如果匹配到了colour(/colour/),那么就跳转到标签lable处继续执行下面的命令(s/$/ \!/),而略过了(s/colour/COLOUR/),这就是b lable的作用。接着看:
执行以下语句(这是sed1line中的一个例子):
[root@A ~]# sed '{:a;s/^.\{1,78\}$/ &/;ta}' b
The colour is red
The colour is green
The colour is black
The colour is yellow
可以看出,语句执行后,文件中的每一行都占用了79个字符并且右对齐了,那么sed语句是怎么得到这个结果的呢?首先,设置了一个标签(:a),接下来执行s/^.\{1,78\}$/ &/,它的作用是在每一行原本内容的前面补一个空格,如果执行成功,那么就继续执行ta,ta是什么意思?这就是我们要说的条件跳转,只有当它前面的替换成功了,才会执行ta,如果前面的替换不成功,那么sed对这一行的处理就over了,该下一行了,就这么简单。在这个例子中,实际上:a.....ta形成了一个循环,它不停的执行替换,直到这一行的字符数量达到了78加上一个空格共79个的时候,那么循环停止,也就是替换不成功了,那么就不会再执行ta了,sed会接着开始处理下一行。
sed我也是初学,关于标签的更多用法,我也在研究当中,这次就先说这么多了!
阅读(4235) | 评论(0) | 转发(0) |