【问题标题】:What can awk do that sed can't?awk 能做什么而 sed 不能?
【发布时间】:2010-11-24 03:00:10
【问题描述】:

我将 sed 用于批处理 ptovess,而我无法使用 awk 来完成。 awk 能做到吗?还是更多的是选择问题并调用 awk 和 sed 等效的用法。他们都使用 i/o 进行常见的搜索替换。有没有一个很好的例子,一个不能做而另一个可以做?

【问题讨论】:

    标签: sed awk turing-complete


    【解决方案1】:

    一个主要区别是 awk 程序可以保持状态,并且可以对同一数据使用多次传递。 sed 调用必然是无状态的单通道,因为 sed(流编辑器)本质上是面向流的。不过,优点是这使得 sed 更简单,更适合在管道链中使用。

    【讨论】:

    • 我不认为 sed “更适合在管道链中使用” - 仅仅因为 awk 可以执行多次传递,没有什么能强迫你实际这样做。对于许多与管道相关的任务(例如选择特定字段),awk 比 sed 更易于使用。
    • @anon 让我感到奇怪的是,你是如何在一些“awk vs sed”的东西中转换这个线程的。一点帮助都没有。
    【解决方案2】:

    在原版中(仍然是最好的) 本书,The AWK Programming Language,实现了以下内容(以及许多其他内容):

    • 一个简单的汇编器
    • 递归下降编译器
    • 文本索引程序

    尝试用 sed 来做。

    【讨论】:

    • 我认为这是对一个完全不同的问题的回答。问题是“awk 不能做什么,sed 可以做什么?”,而不是“awk 能做什么,sed 不能做什么”。仅仅说“awk 更好、更强、更快”根本无法回答问题。
    【解决方案3】:

    生日,

    awk 更强大。 sed 的功能往往更加有限。

    Sed 适用于基于行的数据更改。它有一些简单的循环结构、常用的 ed/ex/vi 正则表达式和替换、复合语句、决策等。大多数人使用它来修改管道数据。

    Awk 非常适合过滤或重新排列数据。它主要用于报告。

    我建议看看 Dale Dougherty 的优秀著作“sed & awk”(sanitised Amazon link)。顺便说一句,那里也有对正则表达式的最佳解释之一。

    很多人会说无论如何都要使用 Perl! (-:

    编辑:忘了说 awk 语言很像 C,鉴于 awk 中的“k”代表 Brian Kernighan,这并不奇怪。是的。 那个布赖恩·克尼汉!

    此外,sed 仅适用于数据流,而 awk 则适用于数据流和文件。

    HTH

    干杯,Sed 仅适用于数据流,而 awk 适用于数据流和文件。

    【讨论】:

    • 是的。但是,正如您所说, -s 选项是 GNU 特定的。 Vanilla sed 实现是基于流的。就是这样。
    【解决方案4】:

    我能想到的唯一一件事是 sed 可以在 awk 的更少字符数方面做一些小的改变。因此,要在实时 shell 上进行快速调整,输入速度会更快。

    【讨论】:

      【解决方案5】:

      SED 是一个流编辑器,因此没有变量,也没有像 AWK 那样的一些其他结构。 AWK 是一种成熟的语言。

      【讨论】:

      • AWK 与 sed 不同,是否适合查找和替换任何 unicode 或 ascii 代码?因此,处理所有控制字符,包括换行符、EOF 等。作为二进制?
      猜你喜欢
      • 2011-08-23
      • 2018-05-30
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多