【发布时间】:2016-03-20 21:18:33
【问题描述】:
我只是想知道 Linux 中 sed 的 b 命令是什么。例如:
sed "/some pattern/b" a.txt
【问题讨论】:
-
见here
标签: sed
我只是想知道 Linux 中 sed 的 b 命令是什么。例如:
sed "/some pattern/b" a.txt
【问题讨论】:
标签: sed
b 命令stands for branching:无条件分支到标签。标签可以省略(如您的示例),在这种情况下开始下一个循环。
请注意,在大多数情况下,使用此命令意味着您可能最好使用某种真正的编程语言(如 awk、Perl 或 Python)进行编程。
【讨论】:
think positive 关于您的数据。我的意思是积极绕过线路,它可以让你专注于那些剩下的。它还可以消除对{..} 命令进行分组的需要。
在 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 目录,发现其中有97 个使用sed 的脚本,包括一些非常复杂的sed 块。我只找到了一个使用sed 标签和分支的脚本(rmemptysubdirs):
# Remove empty directories from paths
find "$@" -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 命令。
【讨论】:
b 使用时没有标签名称,GNU 将跳转到一个空标签而不是脚本末尾。
sed branching 文档中。