在POSIX sed和GNU sed - 和sed其它变体 - 的b命令跳到一个标签的脚本,或在不存在标签的名称,到脚本的末尾。这是无条件的跳跃。还有一个有条件的跳跃;那是t。你用:label做一个标签。
在您的问题的脚本的上下文中,b是无用的。如果模式匹配,则会转到脚本的末尾,就像没有匹配一样。
因为当t命令非常有用的一个例子,考虑数据文件(data):
Be very, very, very, very, very, very scared of sed scripts with branches.
现在考虑这些sed脚本的输出:
$ sed 's/very, very/very/' data
Be very, very, very, very, very scared of sed scripts with branches.
$ sed 's/very, very/very/g' data
Be very, very, very scared of sed scripts with branches.
$ sed -e ':label' -e 's/very, very/very/g' -e 't label' data
Be very scared of sed scripts with branches.
$
确保你明白s///g修饰符的作用以及结果为何如此。
我去了我的$HOME/bin目录,发现其中使用sed的97个脚本,其中包括一些非常复杂的sed块。我只找到一个脚本(rmemptysubdirs)使用sed标签和分支:
# Remove empty directories from paths
find "[email protected]" -type d -print |
sed -ne 'p
:b
s%/[^/]*$%%
p
t b' |
sort -ur |
xargs rmdir 2>/dev/null
的sed脚本这里转换包含行:
/absolute/path/name/for/directory
到:
/absolute/path/name/for/directory
/absolute/path/name/for
/absolute/path/name
/absolute/path
/absolute
注意,脚本使用标签b,而不是b命令。