只想知道它们之间的主要区别是什么?以及每种语言的功能(最好使用它)。
编辑:不是“ vs”。就像话题,只是信息。
只想知道它们之间的主要区别是什么?以及每种语言的功能(最好使用它)。
编辑:不是“ vs”。就像话题,只是信息。
Answers:
在出现的顺序,语言是sed
,awk
,perl
,python
。
该sed
程序是一个流编辑器,旨在将脚本中的操作应用于输入文件的每一行(或更一般而言,应用于指定的行范围)。它的语言基于ed
Unix编辑器,尽管它具有条件等,但是很难处理复杂的任务。您可以用它创造一些小奇迹-但要花很多钱。但是,当尝试在其权限范围内执行任务时,它可能是最快的程序。(它具有所讨论程序的功能最弱的正则表达式-足以满足许多目的,但肯定不是PCRE-与Perl兼容的正则表达式)
该awk
程序(以其作者的名字缩写命名-Aho,Weinberger和Kernighan)最初是用于格式化报告的工具。它可以用作汤sed
。在最新版本中,它在计算上是完整的。它使用了一个有趣的想法-该程序基于“模式匹配”和“模式匹配时采取的动作”。这些模式非常强大(扩展正则表达式)。动作的语言类似于C。的主要功能之一awk
是它将输入自动分为记录,每个记录又分为字段。
Perl的部分编写是awk杀手和sed杀手。附带的两个程序是a2p
,s2p
用于将awk
脚本和sed
脚本转换为Perl。Perl是下一代脚本语言中最早的一种(Tcl / Tk可能声称是首要的)。它具有功能强大的集成正则表达式处理功能,并且语言功能强大得多。它提供对几乎所有系统调用的访问,并具有CPAN模块的可扩展性。(既不是可扩展的,awk
也不sed
是可扩展的。)Perl的座右铭之一是“ TMTOWTDI-做到这一点的方法不止一种”(发音为“ tim-toady”)。Perl有“对象”,但它不仅仅是语言的基本组成部分,而是附加组件。
Python是最后编写的,可能部分是对Perl的反应。它具有一些有趣的句法概念(缩进以指示级别-没有大括号或等效项)。从根本上说,它比Perl更面向对象。它与Perl一样可扩展。
OK-什么时候使用每个?
我不知道Perl可以做Python无法做到的任何事情,反之亦然。两者之间的选择将取决于其他因素。我在没有Python之前就学习了Perl,所以我倾向于使用它。Python的语法较少,而且通常更易于学习。Perl 6上市后,将是一个引人入胜的发展。
(请注意,尤其是Perl和Python的“概述”还很不完整;整本书都可以写成该主题。)
awk
在sed
学习(虽然双方仍然有其用途)。关于任务的大小:sed
最好是一次处理一行,每行之间没有存储。 awk
通常用于建立从所有来源累积的数据的关联数组;它使用更多的内存,因此与大数据集相比,sed
它更有可能遇到大数据集问题。tsawk
在您链接到它之前,我还没有听说过。当任务太多时,我倾向于使用Perl(但是您可能会更好地使用Python)awk
。
掌握了数十种语言后,您会厌倦像S. Lott这样的人(请参阅他对此问题的有争议的答案,在回答六年后,向下投票的比例几乎是向上投票的一半(+ 45 / -22))。
Sed是用于极其简单的命令行管道的最佳工具。在sed管理员的手中,它适合一次性复杂的应用程序,但除非常简单的替换管道外,不应在生产代码中使用。诸如“ s / this / that /”之类的东西。
当只有一个输入源和一个输出(或依次写入的多个输出)时,Gawk(GNU awk)是进行复杂数据重新格式化的最佳选择。由于大量实际工作都符合此描述,并且优秀的程序员可以在两个小时内学习gawk,因此这是最佳选择。在这个星球上,更简单,更快更好!
当您有非常复杂的输入/输出方案时,Perl或Python远远优于任何版本的awk或sed。从维护和可读性的角度来看,问题越复杂,使用python的效果就越好。但是请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写无法维护的废话,因此,如果说Perl或python是程序员,则可以放心地选择perl或python熟练而聪明。
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 秒钟就超过了2秒。您必须意识到的是,Perl具有比那些更快的regex功能更多的regex功能,包括允许您在regex中包含Perl代码以改变其匹配项。 。如果需要,您可以实现一个模块,以将内置模块交换为其他模块。
我不会将sed称为成熟的编程语言,它是一种流编辑器,具有旨在以编程方式编辑文本文件的语言构造。
Awk只是一种通用语言,但它仍然最适合于文本处理。
Perl和Python是成熟的通用编程语言。Perl扎根于文本处理,并具有许多类似awk的构造(甚至网上都有awk-to-perl脚本浮动)。Perl和Python之间有很多区别,您最好的选择可能是在Wikipedia等上阅读两种语言的摘要,以更好地了解它们的含义。
首先,列表“ Perl,Python awk和sed”中有两个不相关的内容。
事情1-简化的文本操作工具。
sed。它具有固定,相对简单的工作范围,该范围由读取和检查文件的每一行的想法定义。sed并非旨在使其特别可读。它被设计为在非常小的Unix服务器上非常小且非常高效。
w 它的固定性稍差,工作范围也较简单。但是,awk程序的主循环是通过隐式读取源文件的行来定义的。
这些不是“完整的”编程语言。尽管您可以通过一些工作用awk编写相当复杂的程序,但它很快变得复杂且难以阅读。
第2件事-通用编程语言。它们具有丰富的语句类型,大量的内置数据结构,并且没有任何固定的假设或捷径可言。
Perl。
蟒蛇。
什么时候使用它们。
sed。决不。在内存超过32K的现代计算机中,它确实没有任何价值。Perl或Python更清楚地执行了相同的操作。
w 决不。像sed一样,它反映了更早的计算时代。与其维护这种语言(除了一个成功的系统所需的所有其他语言),不如简单地用一种令人愉悦的语言来做所有事情。
Perl。任何形式的编程问题。如果您喜欢自由思考的语法,并且有很多很多方法可以执行相同的操作,那么perl很有趣。
蟒蛇。任何形式的编程问题。如果您喜欢语法相当有限的语法,那么其中的选择更少,细节更少,并且(也许)更加清晰。Python的面向对象特性使其更适合于大型复杂问题。
背景-我并不是因为无知而抨击sed和awk。我20多年前学过awk。它做了很多事情;曾经将其作为Unix的核心技能来教授。我大约15年前学习了Perl。做了很多复杂的事情。我把两者都抛在后面是因为我可以在Python中做同样的事情-而且更简单,更清晰。
sed和awk有两个严重的问题,都不是年龄。
其实施不完整。sed和awk所做的一切都可以在Python或Perl中完成,通常更简单,有时也更快。Shell管道由于具有多重处理而具有一些性能优势。Python提供了一个subprocess
模块,使我可以恢复这些优势。
需要学习另一种语言。通过使用Python(或Perl)执行操作,您的实现依赖于更少的语言,从而提高了清晰度。
何时使用它们:awk-永远不会-S. Lott。
我认为洛特(S. Lott)对此建议略有遗漏。事实是,在Linux和其他UNIX环境上,awk是与bash,sh和ksh一起用于快速文本处理的有用工具。脚本本身的想法是,您可以通过将该工具(即该工具)粘合在一起来解决问题。因此,在管理脚本中,通常具有ls,grep,|,awk,time,ps等。每个脚本编写器都将其组合为一个工具,就像构建器一砖一瓦地完成建筑(解决当前的问题) 。
例如,我是团队管理的团队成员 彩弹装备互联网。该电子商务网站基于LAMP堆栈。为了自动处理和标准化来自各个供应商的数据馈入后端数据库,我们采用并维护了多种脚本组合,包括bash,perl,php甚至期望。每个模块都有其优势,这取决于可用的模块和API。在bash脚本中,我们使用awk进行模式的快速模式匹配和适当的操作,而无需切换到PERL。我还想指出的一件事是,这些脚本中有相当一部分是从开放源代码中购买或获得的,而在线程中并未强调。如果脚本以Perl的形式出现,则我们将其保留为Perl;如果脚本以Php格式出现,我们将其保持为Php;如果它是bash,我们将其保持为bash;
ls
,请改用glob。读这个。