2015-12-15 196 views

回答

2

b的命令stands for branching:无条件分支到标签。标签可以省略(如你的例子),在这种情况下,下一个周期开始。

请注意,在大多数情况下,使用此命令意味着您可能更适合使用awk,Perl或Python等真实编程语言进行编程。

+0

我发现当标签被省略时,它可以让你“积极地思考”你的数据。我的意思是通过积极绕过线条,它可以让你专注于那些剩下的线条。它也可以避免将'{..}'命令分组。 – potong

0

在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命令。

+0

可能要注意的是,如果没有标签名称使用'b',则GNU将分支到空标签而不是脚本的末尾。 – 123

+0

@ 123:我没有看到你在GNU'sed'关于[分支]文档中记录的行为(https://www.gnu.org/software/sed/manual/sed.html#Programming-Commands) 。 –

+0

这不是,这是一个错误 – 123