sed 替换上下文中 d 和 t 的函数
Function of d and t in sed substitution context
我使用了 sed 的替换生成器,它给了我
sed -E 's/([^ ]+)│m/│T/gm;t;d'
我熟悉正则表达式标志g和m,但我从未见过t
和d
。在查找它们之后,似乎 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.
我使用了 sed 的替换生成器,它给了我
sed -E 's/([^ ]+)│m/│T/gm;t;d'
我熟悉正则表达式标志g和m,但我从未见过t
和d
。在查找它们之后,似乎 t 用于测试而 d 用于删除。但在这种特定情况下,这意味着什么?他们对整个命令有什么贡献?
引用 sed
手册:
d
: Delete pattern space. Start next cycle.
t label
: If as///
has done a successful substitution since the last input line was read and since the last t or T command, then branch tolabel
; iflabel
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.