ChatGPT解决这个技术问题 Extra ChatGPT

Perl、Python、AWK 和 sed 有什么区别? [关闭]

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您认为此问题可以改进并可能重新打开,请访问帮助中心获取指导。 10年前关闭。

它们之间的主要区别是什么?在哪些典型场景中使用每种语言更好?

这些所谓的非建设性问题真的很有帮助。
当然,在首页上找到它们的标签会很方便......
命令行上python的用处,见pyp

k
kvantour

按出现顺序,语言为 sedawkperlpython

sed 程序是一个流编辑器,旨在将脚本中的操作应用于输入文件的每一行(或更一般地说,应用于指定的行范围)。它的语言基于 Unix 编辑器 ed,虽然它有条件等,但很难用于复杂的任务。你可以用它创造小奇迹——但要付出你头上的头发的代价。但是,在尝试其职权范围内的任务时,它可能是最快的程序。 (它具有讨论的程序中最不强大的正则表达式 - 足以满足许多目的,但肯定不是 PCRE - Perl-Compatible Regular Expressions)

awk 程序(名称取自其作者姓名的首字母 - Aho、Weinberger 和 Kernighan)最初是用于格式化报告的工具。它可以用作增强型sed;在其最新版本中,它在计算上是完整的。它使用了一个有趣的想法——该程序基于“模式匹配”和“模式匹配时采取的操作”。这些模式相当强大(扩展正则表达式)。操作的语言类似于 C。awk 的主要功能之一是它自动将输入拆分为记录,并将每条记录拆分为字段。

Perl 部分是作为 awk-killer 和 sed-killer 编写的。它提供的两个程序是 a2ps2p,用于将 awk 脚本和 sed 脚本转换为 Perl。 Perl 是最早的下一代脚本语言之一(Tcl/Tk 可能占据主导地位)。它具有强大的集成正则表达式处理和更强大的语言。它提供对几乎所有系统调用的访问,并具有 CPAN 模块的可扩展性。 (awksed 都不是可扩展的。)Perl 的座右铭之一是“TMTOWTDI - Theres more than one way to do it”(读作“tim-toady”)。 Perl 有“对象”,但它更像是一个附加组件,而不是语言的基本部分。

Python 是最后编写的,可能部分是对 Perl 的反应。它有一些有趣的句法思想(缩进表示级别 - 没有大括号或等价物)。它比 Perl 更基本面向对象;它和 Perl 一样可扩展。

好的 - 什么时候使用每个?

Sed - 当您需要对文件进行简单的文本转换时。

awk - 当您只需要简单的格式化和汇总或数据转换时。

Perl - 几乎适用于任何任务,尤其是当任务需要复杂的正则表达式时。

Python - 用于您可以使用 Perl 的相同任务。

我不知道 Perl 可以做 Python 做不到的任何事情,反之亦然。两者之间的选择将取决于其他因素。我在 Python 出现之前就学习了 Perl,所以我倾向于使用它。 Python 具有较少的附加语法,并且通常更易于学习。 Perl 6,当它可用时,将是一个引人入胜的发展。

(请注意,Perl 和 Python 的“概述”尤其是非常不完整;整本书都可以写在这个主题上。)


一个++++帖子,会再读一遍!
很棒,尤其是“何时使用每个”部分
请注意,python 的禅宗基本上是 TMTOWTDI 的对立面,所以我会说它可能是对 perl 的反应。 iirc TCL 稍微落后于 perl,并且对 perl 也相当反动,尽管 TCL 的反应是语法和语言复杂性,而不是做事的方法
不管最初的意图是什么,很明显,后来的 Python 开发和 Python 社区更喜欢可读性和一致性,而不是 Perl 更灵活但更简洁的语法。出色的职位乔纳森
@blasto:对于 ETL,我会优先考虑 awk 而不是 sed 进行学习(尽管两者仍有其用途)。至于任务的大小:sed 在一次处理一行时处于最佳状态,没有逐行存储。 awk 通常用于构建关联数组,其中包含从所有来源累积的数据;它使用更多内存,因此比 sed 更容易遇到大型数据集的问题。在您链接到它之前,我没有听说过 tsawk。当一项任务对 awk 来说太多时,我倾向于使用 Perl(但您可能使用 Python 做得更好)。
R
Russia Must Remove Putin

在掌握了几十种语言之后,你会厌倦像 S. Lott 这样的人(参见他对这个问题的有争议的回答,在回答六年后,反对票的数量几乎是赞成票(+45/-22)的一半)。

Sed 是极其简单的命令行管道的最佳工具。在 sed 大师手中,它适用于任意复杂的一次性,但它不应该用于生产代码,除非在非常简单的替换管道中。像's/this/that/.'这样的东西

当只有一个输入源和一个输出(或多个输出顺序写入)时,Gawk(GNU awk)是迄今为止复杂数据重新格式化的最佳选择。由于现实世界的大量工作都符合这个描述,而且一个好的程序员可以在两个小时内学会 gawk,它是最好的选择。在这个星球上,越简单越快越好!

当您有非常复杂的输入/输出场景时,Perl 或 Python 比任何版本的 awk 或 sed 都要好得多。从维护和可读性的角度来看,问题越复杂,使用 python 的效果就越好。但是请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写无法维护的废话,因此如果该程序员是熟练和聪明。


100% 同意。了解大多数(如果不是全部)工具以及何时使用每种工具是优秀技术人员与平庸技术人员的区别。
我要补充一点,选择 Python 或 Perl 而不是 awk 的另一个原因是,当您的转换要求涉及复杂的验证或逻辑时,另一种语言具有现有的健壮模块。想想在 awk 中正确处理电子邮件或街道地址需要什么,你就会明白我的意思:perl 和 python 的库可以使此类事情变得微不足道,而在 awk 中这些是不常见的或不可用的。
实际上,正如 Perl 旨在包含 Sed 和 Awk 一样;我发现用 Perl 编写它比学习 Sed 或 Awk 更容易。
@BradGilbert:就像我刚刚在最佳答案中提到的那样,Perl(&Python、ruby 等) 对 awk 的警告是,某种正则表达式在前者中速度较慢:swtch.com/~rsc/regexp/regexp1.html
@OlivierDulac 是的,这显示了一个病理病例。如果您从 a?ⁿaⁿ 更改为 a??ⁿaⁿ,则在 Perl 5 中运行它, 为 1,000,000,它会在不到两秒的时间内运行。 time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m' 如果您运行简单的程序,则 仅 25 需要两秒钟以上。您必须意识到,Perl 比那些更快的功能具有更多的正则表达式功能,包括允许您将 Perl 代码包含在改变它匹配的正则表达式。如果需要,您可以实现一个模块,将内置模块替换为其他模块之一。
R
Robert Gamble

我不会将 sed 称为成熟的编程语言,它是一种流编辑器,具有旨在以编程方式编辑文本文件的语言结构。

awk 更像是一种通用语言,但它仍然最适合文本处理。

Perl 和 Python 是成熟的通用编程语言。 Perl 起源于文本处理,并且有许多类似 awk 的结构(甚至网上流传着一个 awk-to-perl 脚本)。 Perl 和 Python 之间有很多不同之处,最好的办法可能是在 Wikipedia 之类的网站上阅读这两种语言的摘要,以便更好地了解它们是什么。


我见过 Sokoban 的 sed 实现,这意味着图灵完备。但是,sendmail.cf 和 TeX 也可以这样说。
我曾经和一个写过 PostScript 的人一起工作,他将激光打印机变成了路由器。
@山姆:哇!我不知道打印机的激光可以开到足以切割木材!哦,对不起,路由器类型不对。
sed,不是一门成熟的语言?好吧,这并不完全正确,因为 sed is turing complete ;)
我已经在 awk 中看到了第四种语言的实现。 (由于 awk 本身可以被视为解析器,因此在其中实现解释器相当简单)。
b
brian d foy

首先,列表“Perl、Python awk 和 sed”中有两个不相关的东西。

事物 1 - 简单的文本操作工具。

赛德。它有一个固定的、相对简单的工作范围,由读取和检查文件的每一行的想法定义。 sed 的设计并不是特别可读。它被设计为在非常小的 unix 服务器上非常小且非常高效。

哦。它的工作范围稍微不那么固定,也不那么简单。但是,awk 程序的主循环是通过隐式读取源文件的行来定义的。

这些不是“完整”的编程语言。虽然您可以通过一些工作在 awk 中编写相当复杂的程序,但它很快就会变得复杂且难以阅读。

事物 2 - 通用编程语言。它们具有丰富多样的语句类型、大量内置数据结构,并且没有内置的假设或捷径可言。

珀尔。

Python。

何时使用它们。

赛德。绝不。在内存超过 32K 的现代计算机时代,它确实没有任何价值。 Perl 或 Python 更清楚地执行相同的操作。

哦。绝不。与 sed 一样,它反映了更早的计算时代。与其保持这种语言(除了成功系统所需的所有其他语言),不如用一种愉快的语言简单地做所有事情更愉快。

珀尔。任何类型的任何编程问题。如果你喜欢自由思考的语法,有很多很多方法可以做同样的事情,perl 很有趣。

Python。任何类型的任何编程问题。如果您喜欢相当有限的语法,选择更少,微妙之处更少,并且(也许)更清晰。 Python 的面向对象特性使其更适合处理大型、复杂的问题。

背景——我并不是因为无知而抨击 sed 和 awk。我在 20 多年前学习了 awk。用它做了很多事情;曾经把它作为一项核心的unix技能来教授。大约 15 年前我学习了 Perl。用它做了很多复杂的事情。我把两者都抛在了后面,因为我可以在 Python 中做同样的事情——而且它更简单、更清晰。

sed 和 awk 有两个严重的问题,这两个问题都不是他们的年龄。

他们实施的不完整性。 sed 和 awk 所做的一切都可以在 Python 或 Perl 中完成,通常更简单,有时也更快。由于它的多处理,shell 管道具有一些性能优势。 Python 提供了一个子流程模块,让我能够恢复这些优势。需要学习另一种语言。通过在 Python(或 Perl)中做事,您的实现依赖于更少的语言,从而提高了清晰度。


反对 awk/sed 的一些非常愚蠢的论点。出于同样的原因 sed 和 awk 仍然可以使用可调扳手并没有取代开口扳手。有时,简单的工具最适合这项工作。我写了很多 perl,但是对于一个简单的管道命令链,awk/sed 比 perl -e 快
您不能假设在大多数非 Linux Unix 系统上除了 sh、sed 和 awk 之外的任何东西都可用。如果您想在开箱即用的 Solaris、HP/UX 或 AIX 安装上工作,那么您只能使用 sed 和 awk。
我有一半的 shell 脚本使用 sed 或 awk。他们离死还很远。 Python 是我首选的脚本语言,但有时 sed 和 awk 是完成这项工作的最佳工具。仅仅因为它们已经使用了很多年,并不意味着它们已经过时了。
@S.Lott:我并不是建议任何人都应该尝试在 awk 中构建网络应用程序,但是说它们永远不应该被使用是有点离谱的。对于简单的 s&r 和/或调整(尤其是对分隔的文本文件), perl -e 或 python -c 永远不会像 sed/awk 单线那样有效。
我不喜欢这样的答案。 sed 和 awk 在几个小时内就很容易理解,并且比完整的语言更轻量级和广泛可用。 Shell 编程与以往一样重要。
B
Bart Riordan

何时使用它们:awk - 从不 - S. Lott。

我认为 S. Lott 的这条建议略微偏离了目标。事实上,在 Linux 和其他 UNIX 环境中,awk 是与 bash、sh 和 ksh 一起用于快速文本处理的有用工具。脚本本身的想法是通过将这个工具、那个工具粘合在一起来解决你的问题。因此,在管理脚本中,有 ls、grep、|、awk、time、ps 等是很常见的。每个都是脚本编写者像砖块一样组合起来完成构建的工具(以解决手头的问题) .

例如,我是管理 paintball gear supplies dotcom 的团队的成员。该电子商务网站基于 LAMP 堆栈。为了自动处理来自不同供应商的数据馈送并将其规范化到后端数据库中,我们使用并维护多种脚本组合,包括 bash、perl、php 甚至期望。每个都有基于可用模块和 API 的优势。在 bash 脚本中,我们使用 awk 进行快速模式匹配并根据需要对模式执行适当的操作,而无需切换到 PERL。我还想指出的一件事是线程中没有强调的,这些脚本中有相当一部分是购买的,或者是从开源获得的。如果脚本以 Perl 的形式出现,我们将其维护为 Perl;如果脚本以 Php 的形式出现,我们将其维护为 Php;如果它以 bash 的形式出现,我们将其维护为 bash;我们不会仅仅因为我们认为在原始语言中效率较低而用另一种语言重写它。


是 S.Lott 写了你引用的回复,而不是 brian d foy...
作为这个相当老的答案的旁注:永远不要解析 ls 的输出,而是使用 glob 。 read this.