【发布时间】:2020-08-04 21:03:22
【问题描述】:
我为 sed 使用了替代生成器,它给了我
sed -E 's/([^ ]+)│m/\1│T/gm;t;d'
我熟悉正则表达式标志 g 和 m,但我从未见过 t 和 d。在查找它们之后,似乎 t 用于测试而 d 用于删除。但在这种特殊情况下,这意味着什么?它们对完整的命令有何贡献?
【问题讨论】:
标签: unix sed substitution
我为 sed 使用了替代生成器,它给了我
sed -E 's/([^ ]+)│m/\1│T/gm;t;d'
我熟悉正则表达式标志 g 和 m,但我从未见过 t 和 d。在查找它们之后,似乎 t 用于测试而 d 用于删除。但在这种特殊情况下,这意味着什么?它们对完整的命令有何贡献?
【问题讨论】:
标签: unix sed substitution
引用sed手册:
d:删除模式空间。开始下一个周期。
t label:如果s///在读取最后一个输入行和最后一个t或T命令后成功替换,则跳转到label;如果label被省略,则跳转到脚本末尾。
换句话说,如果s 命令成功,则打印生成的模式空间,否则跳过(删除)该行。
另一种表达方式是:
sed -n -E 's/([^ ]+) m/\1 T/gmp'
【讨论】:
/g 标志),所以我将删除;t;d 部分。谢谢!
grep | sed 更有效。
sed 是它自己的“语言”和它自己的命令。它不是“正则表达式工具”,而是“流编辑器”。
我熟悉正则表达式标志 g 和 m,
s 命令有自己的修饰符,m 是 GNU 扩展。我真的不明白它在这里是如何使用的,因为sed 在这里一次读取一行,而m 修改了^ 和$ 的行为....
但在这种特殊情况下,这意味着什么?
在任何可能的上下文中,如果(任何)s/// 命令成功,t 命令会跳转到标签。如果省略label,则跳转到脚本末尾。
d 命令删除模式空间,有效地删除典型解析中的行。
t;d 是一个助记符,用于在最后一个 s 命令不成功时删除该行。我更喜欢/pattern/!d; s//replacement/g,这对我来说更具可读性。
sed 行为的参考是posix sed documentation 和gnu sed documentation。
【讨论】:
/g 标志),所以我将删除;t;d 部分。谢谢!
sed 需要一些时间来理解那里发生了什么,所有的模式和保持空间。