sed 替换上下文中 d 和 t 的函数

Function of d and t in sed substitution context

我使用了 sed 的替换生成器,它给了我

sed -E 's/([^ ]+)│m/│T/gm;t;d'

我熟悉正则表达式标志g和m,但我从未见过td。在查找它们之后,似乎 t 用于测试而 d 用于删除。但在这种特定情况下,这意味着什么?他们对整个命令有什么贡献?

引用 sed 手册:

d: Delete pattern space. Start next cycle.

t label: If a s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to label; if label is omitted, branch to end of script.

换句话说,如果 s 命令成功,打印结果模式 space,否则跳过(删除)该行。

另一种表达方式是:

sed -n -E 's/([^ ]+) m/ T/gmp'

sed 是它自己的“语言”和它自己的命令。它不是“正则表达式工具”,而是“流编辑器”。

I am familiar with regular expression flags g and m,

s 命令有它自己的修饰符,m 是一个 GNU 扩展。我真的不明白它在这里是如何使用的,因为 sed 一次读取一行,而 m 修改 ^$ 的行为......

But in this particular context, what does that mean?

在任何可能的上下文中,如果(任何)s/// 命令成功,t 命令将跳转到标签。如果省略标签,则跳转到脚本末尾。

d 命令删除模式 space,有效地删除典型解析中的行。

如果最后一个s命令不成功,t;d是删除该行的助记符。我更喜欢做 /pattern/!d; s//replacement/g,这对我来说更具可读性。

sed 行为的参考是 posix sed documentation and gnu sed documentation.