272

それらの主な違いは何ですか?また、各言語を使用するのに適した典型的なシナリオはどれですか?

4

5 に答える 5

586

出現順に、言語はsedawkperlpythonです。

このsedプログラムはストリーム エディターであり、スクリプトからのアクションを入力ファイルの各行 (より一般的には指定された範囲の行) に適用するように設計されています。その言語は、Unix エディターに基づいておりed、条件付きなどはありますが、複雑なタスクには使いにくいです。それを使って小さな奇跡を起こすことができますが、頭の毛が犠牲になります. ただし、権限内でタスクを試行する場合、おそらく最速のプログラムです。(議論されたプログラムの中で最も強力でない正規表現を持っています - 多くの目的には十分ですが、確かに PCRE ではありません - Perl-Compatible Regular Expressions)

このawkプログラム (作成者のイニシャル - Aho、Weinberger、および Kernighan に由来する名前) は、最初はレポートをフォーマットするためのツールです。スープアップとして使用できますsed。最近のバージョンでは、計算上完全です。これは興味深いアイデアを使用しています。プログラムは「一致したパターン」と「パターンが一致したときに実行されるアクション」に基づいています。パターンはかなり強力です (拡張正規表現)。アクションの言語は C に似ています。 の重要な機能の 1 つはawk、入力を自動的にレコードに分割し、各レコードをフィールドに分割することです。

Perl は、部分的に awk-killer および sed-killer として作成されました。付属の 2 つのプログラムは、a2pスクリプトとスクリプトを Perls2pに変換するためのものです。Perl は、次世代のスクリプト言語の中で最も初期のものの 1 つです (Tcl/Tk はおそらく優位性を主張できます)。はるかに強力な言語を備えた強力な統合正規表現処理を備えています。ほとんどすべてのシステム コールへのアクセスを提供し、CPAN モジュールの拡張性を備えています。(どちらも拡張可能ではありません。) Perl のモットーの 1 つは、「TMTOWTDI - それを行うには複数の方法があります」(「ティム・トアディ」と発音します) です。Perl には「オブジェクト」がありますが、これは言語の基本的な部分というよりもアドオンのようなものです。awksedawksed

Python は最後に書かれたもので、おそらく Perl への反動として部分的に書かれました。いくつかの興味深い構文のアイデアがあります (レベルを示すためのインデント - 波括弧や同等のものはありません)。Perl よりも根本的にオブジェクト指向です。Perl と同じくらい拡張可能です。

OK - それぞれをいつ使う?

  • Sed - ファイルに対して単純なテキスト変換を行う必要がある場合。
  • Awk - データの単純な書式設定と要約または変換のみが必要な場合。
  • Perl - ほぼすべてのタスクに使用できますが、特にタスクで複雑な正規表現が必要な場合に使用します。
  • Python - Perl を使用できるのと同じタスク用。

私は、Perl にできて Python にできないこと、またはその逆のことを知りません。どちらを選択するかは、他の要因によって異なります。Python が登場する前に Perl を学んだので、Perl をよく使います。Python には付加的な構文が少なく、一般的に習得がいくぶん簡単です。Perl 6 が利用可能になると、魅力的な展開になるでしょう。

(特に、Perl と Python の「概要」はひどく不完全であることに注意してください。このトピックについては、本全体を書くことができます。)

于 2008-12-14T21:33:29.233 に答える
99

数ダースの言語を習得した後、S. Lott のような人々にうんざりします (この質問に対する彼の物議を醸す回答を参照してください。回答から 6 年後には、反対票が賛成票 (+45/-22) のほぼ半分です)。

Sed は、非常に単純なコマンドライン パイプラインに最適なツールです。sed マスターの手に渡れば、任意の複雑さの 1 回限りの処理に適していますが、非常に単純な置換パイプラインを除いて、プロダクション コードでは使用しないでください。's/this/that/.' のようなもの。

gawk (GNU awk) は、単一の入力ソースと単一の出力 (または複数の出力が連続して書き込まれる) しかない場合、複雑なデータの再フォーマットに最適な選択肢です。実際の作業の多くはこの説明に準拠しており、優れたプログラマーは 2 時間で gawk を習得できるため、これが最良の選択です。この地球上では、シンプルで速いほど良いです!

非常に複雑な入出力シナリオがある場合、Perl または Python は awk または sed のどのバージョンよりもはるかに優れています。問題が複雑になればなるほど、メンテナンスと読みやすさの観点から、Python を使用する方が良いでしょう。ただし、優れたプログラマーは任意の言語で読み取り可能なコードを書くことができ、下手なプログラマーは有用な言語で保守不可能ながらくたを書くことができることに注意してください。上手で賢い。

于 2010-05-25T14:51:59.757 に答える
22

私は sed を本格的なプログラミング言語とは呼びません。これは、テキスト ファイルをプログラムで編集することを目的とした言語構造を備えたストリーム エディターです。

Awk はもう少し汎用的な言語ですが、それでもテキスト処理に最適です。

Perl と Python は、本格的な汎用プログラミング言語です。Perl はテキスト処理にルーツがあり、多数の awk に似た構造を持っています (ネット上には awk から perl へのスクリプトさえ出回っています)。Perl と Python には多くの違いがあります。Wikipedia などで両方の言語の概要を読んで、それらが何であるかをよく理解することをお勧めします。

于 2008-12-14T21:18:47.097 に答える
18

まず、「Perl、Python awk、および sed」というリストに、無関係なものが 2 つあります。

事 1 - 単純化されたテキスト操作ツール。

  • シード。ファイルの各行を読み取って調べるという考えによって定義された、固定された比較的単純な作業範囲があります。sed は特に読みやすいようには設計されていません。これは非常に小さく、非常に小さな UNIX サーバー上で非常に効率的になるように設計されています。

  • おかしい。やや固定性が低く、作業範囲が単純ではありません。ただし、awk プログラムのメイン ループは、ソース ファイルの行を暗黙的に読み取ることによって定義されます。

これらは「完全な」プログラミング言語ではありません。awk でかなり洗練されたプログラムを作成することはできますが、少し作業すれば、すぐに複雑になり、読みにくくなります。

事 2 - 汎用プログラミング言語。これらには、豊富な種類のステートメント、多数の組み込みデータ構造があり、配線された前提条件や近道はありません。

  • パール。

  • パイソン。

それらをいつ使用するか。

  • シード。一度もない。32K を超えるメモリを搭載したコンピューターの現代では、実際には何の価値もありません。Perl や Python は、同じことをより明確に行います。

  • おかしい。一度もない。sed と同様に、コンピューティングの初期の時代を反映しています。この言語を (システムを成功させるために必要な他のすべてに加えて) 維持するよりも、単純にすべてを 1 つの快適な言語で行う方が快適です。

  • パール。あらゆる種類のプログラミングの問題。同じことをするのに非常に多くの方法がある自由な考え方の構文が好きなら、perl は楽しいものです。

  • パイソン。あらゆる種類のプログラミングの問題。かなり制限された構文が好きな場合は、選択肢が少なく、繊細さが少なく、(おそらく) より明確です。Python のオブジェクト指向の性質により、大規模で複雑な問題により適しています。

背景 -- 私は無知から sed や awk をバッシングしているわけではありません。私は20年以上前にawkを学びました。それを使って多くのことをしました。Unixのコアスキルとして教えていました。私は約15年前にPerlを学びました。それを使って多くの洗練されたものを作りました。Python で同じことを行うことができるため、両方を置き去りにしました。Python の方が単純で明確です。

sed と awk には 2 つの重大な問題があり、どちらも古いものではありません。

  1. それらの実装の不完全さ。sed と awk が行うことはすべて、Python または Perl で実行できます。多くの場合、より簡単で、場合によっては高速でもあります。シェル パイプラインには、そのマルチプロセッシングにより、いくつかのパフォーマンス上の利点があります。Python は、subprocessこれらの利点を回復できるようにするモジュールを提供します。

  2. さらに別の言語を学ぶ必要性。Python (または Perl) で処理を行うことにより、実装に依存する言語が少なくなり、結果として明快さが増します。

于 2008-12-14T22:30:51.960 に答える
16

それらをいつ使用するか: awk - 決して - S. Lott.

S. Lott は、この推奨事項でわずかに目標を達成できなかったと思います。実際のところ、Linux やその他の UNIX 環境では、awk は bash、sh、および ksh と一緒に使用してテキストをすばやく処理できる便利なツールです。スクリプト自体のアイデアは、このツール、あのツールをつなぎ合わせることで問題を解決することです。したがって、管理スクリプトでは、ls、grep、|、awk、time、ps などを使用するのが一般的です。それぞれは、スクリプターがビルダー レンガのように組み合わせて建物を完成させるツールです (当面の問題を解決するため)。 .

たとえば、私はペイントボール用品の供給を管理するチームのメンバーですドットコム。この e コマース サイトは、LAMP スタックに基づいています。さまざまなサプライヤーからバックエンド データベースへのデータ フィードを自動処理および正規化するために、bash、perl、php、さらには Expect など、さまざまなスクリプトの組み合わせを採用および維持しています。利用可能なモジュールと API に基づいて、それぞれに長所があります。bash スクリプトでは、PERL に切り替える必要なく、必要に応じて awk を使用して、迅速なパターン マッチとパターンに対する適切なアクションを実行します。また、このスレッドでは強調されていませんが、これらのスクリプトのかなりの数がオープン ソースから購入または取得されていることも指摘しておきたいと思います。スクリプトが Perl として提供された場合は、Perl として維持します。スクリプトが Php として提供された場合、それを Php として維持します。それが bash として提供された場合は、bash として維持します。

于 2010-04-13T13:27:33.623 に答える