sed进阶之改变执行流程


shell脚本编程系列


分支b

通常,sed编辑器会从脚本的顶部开始,一直执行到脚本的结尾(D命令是一个例外,它会强制sed编辑器在不读取新行的情况下返回到脚本的顶部)。sed编辑器提供了一种方法,可以改变脚本的执行流程,称为分支。该方法可以基于地址、地址模式或地址区间排除一整段命令。允许只对数据流中的特定行执行部分命令。分支(b)命令的格式为:

[address]b [label]

address参数决定了哪些行会触发分支命令,label参数定义了要跳转的位置,如果没有label参数,则跳过触发分支命令的行,继续处理余下的文本行。
指定address参数,但不指定label参数

sed '{2,3b;s/Line/Replacement/}' data2.txt

跳过2,3行 不执行替换命令,分支命令在数据流中的第二行和第三行处跳过了两次替换命令。
sed进阶之改变执行流程_第1张图片
定义label参数,指定分支要跳转到的位置,标签以冒号开始,最多可以有7个字符,比如:label2

sed '{/First/b jump1;s/Line/Replacement/;:jump1;s/Line/Jump Replacement/}' data2.txt

如果某行匹配分支address(包含First单词),那么sed编辑器就会跳转到带有分支标签jump1的那一行,执行后面的命令,而其他行,则沿用脚本中原有的命令处理。
sed进阶之改变执行流程_第2张图片
除了可以跳转到sed脚本下方的标签,也可以跳转到靠前的标签,达到循环的效果

[root@192 Chapter21-Scripts]# echo "This , is , a, test, to, remove, commas." |
> sed -n {'
> :start
> s/,//1p
> /,/b start
> }'
This  is , a, test, to, remove, commas.
This  is  a, test, to, remove, commas.
This  is  a test, to, remove, commas.
This  is  a test to, remove, commas.
This  is  a test to remove, commas.
This  is  a test to remove commas.

sed进阶之改变执行流程_第3张图片

测试t

与分支命令类似,测试(t)命令也可以改变sed编辑器脚本的执行流程。测试命令会根据先前替换命令的结果跳转到某个label处,而不是根据address进行跳转。如果替换命令成功匹配并完成了替换,测试命令就会跳转到指定的标签,如果替换命令未能匹配指定的模式,测试命令就不会跳转。
测试命令的格式和分支命令相同:[address]t [label],在没有指定label的情况下,如果测试成功,sed会跳转到脚本结尾。
sed进阶之改变执行流程_第4张图片

echo "This , is , a, test, to, remove, commas." |
> sed -n '{
> :start
> s/,//1p
> t start
> }'

sed进阶之改变执行流程_第5张图片

你可能感兴趣的:(基础,shell,linux,java,服务器)