【问题标题】:What is sed b command in Linux?Linux 中的 sed b 命令是什么?
【发布时间】:2016-03-20 21:18:33
【问题描述】:

我只是想知道 Linux 中 sed 的 b 命令是什么。例如:

sed "/some pattern/b" a.txt  

【问题讨论】:

标签: sed


【解决方案1】:

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

请注意,在大多数情况下,使用此命令意味着您可能最好使用某种真正的编程语言(如 awk、Perl 或 Python)进行编程。

【讨论】:

  • 我发现当标签被省略时,它允许您think positive 关于您的数据。我的意思是积极绕过线路,它可以让你专注于那些剩下的。它还可以消除对{..} 命令进行分组的需要。
【解决方案2】:

在 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 将跳转到一个空标签而不是脚本末尾。
  • @123:我没有看到您声称的行为记录在 GNU sed branching 文档中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2013-06-05
  • 1970-01-01
  • 2021-07-25
  • 2016-08-13
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多