【问题标题】:Function of d and t in sed substitution contextsed 替换上下文中 d 和 t 的函数
【发布时间】:2020-08-04 21:03:22
【问题描述】:

我为 sed 使用了替代生成器,它给了我

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

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

【问题讨论】:

    标签: unix sed substitution


    【解决方案1】:

    引用sed手册:

    d:删除模式空间。开始下一个周期。

    t label:如果s///在读取最后一个输入行和最后一个t或T命令后成功替换,则跳转到label;如果label 被省略,则跳转到脚本末尾。

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

    另一种表达方式是:

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

    【讨论】:

    • 谢谢,这一切都清楚了。我觉得有点奇怪的是,一个工具默认会建议一个命令,如果找不到匹配项,则应该删除整行。我不需要这个功能(但我确实需要/g 标志),所以我将删除;t;d 部分。谢谢!
    • 不客气。你比我更了解上下文。我认为你的 sed 命令是 grep+modify,但比 grep | sed 更有效。
    【解决方案2】:

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

    我熟悉正则表达式标志 g 和 m,

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

    但在这种特殊情况下,这意味着什么?

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

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

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

    sed 行为的参考是posix sed documentationgnu sed documentation

    【讨论】:

    • 谢谢。我找到了一些文档,但是如果您不熟悉它的确切工作原理,那就太模糊了。我不清楚什么会被删除,但显然是整个输入。我觉得有点奇怪,我使用的工具默认会建议一个命令,如果找不到匹配项,则应该删除整行。我不需要这个功能(但我确实需要/g 标志),所以我将删除;t;d 部分。谢谢!
    • 是的,sed 需要一些时间来理解那里发生了什么,所有的模式和保持空间。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2014-11-07
    • 2020-11-03
    相关资源
    最近更新 更多