回答:
外観のためには、言語はsed
、awk
、perl
、python
。
sed
プログラムは、入力ファイルまたはファイルのストリームエディタで、(行の指定した範囲に、より一般的に、)各ラインにスクリプトからアクションを適用するように設計されています。その言語はed
Unixエディターであるに基づいており、条件付きなどがありますが、複雑なタスクを処理するのは困難です。あなたはそれでマイナーな奇跡を働かせることができます-しかしあなたの頭の髪の代償を払って。ただし、その権限内でタスクを試行する場合は、おそらくプログラムの中で最速です。(それは議論されたプログラムの最も強力でない正規表現を持っています-多くの目的には十分ですが、確かにPCREではありません-Perl互換の正規表現)
awk
プログラム(その作者の頭文字から名前-アホ、ワインバーガー、とカーニハン)は、レポートの書式設定のため、当初のツールです。スープとして使用できますsed
。最近のバージョンでは、計算的に完全です。これは興味深いアイデアを使用しています。プログラムは「パターンが一致した」と「パターンが一致したときに実行されたアクション」に基づいています。パターンはかなり強力です(拡張正規表現)。アクションの言語はCに似ています。の主要な機能の1つはawk
、入力を自動的にレコードに分割し、各レコードをフィールドに分割することです。
Perlの一部はawk-killerおよびsed-killerとして作成されました。それに付属しているプログラムの二つがあるa2p
とs2p
変換するためのawk
スクリプトとsed
のPerlにスクリプトを。Perlは次世代のスクリプト言語の最も初期の1つです(Tcl / Tkはおそらく優位性を主張できます)。非常に強力な言語による強力な統合正規表現処理を備えています。ほとんどすべてのシステムコールへのアクセスを提供し、CPANモジュールの拡張性があります。(どちらawk
もsed
拡張可能ではありません。)Perlのモットーの1つは「TMTOWTDI-これを行う方法は複数あります」(「tim-toady」と発音)。Perlには「オブジェクト」がありますが、これは言語の基本的な部分というよりはアドオンです。
Pythonは最後に作成されましたが、おそらくPerlへの反応として一部作成されました。興味深い構文のアイデアがあります(レベルを示すためにインデント-中括弧や同等のものはありません)。Perlよりも基本的にオブジェクト指向です。Perlと同じように拡張可能です。
OK-それぞれをいつ使うべきですか?
私は、Pythonができないこと、またはその逆のことをPerlができることは何も知りません。2つの間の選択は、他の要因に依存します。Pythonが登場する前にPerlを学んだので、私はそれを使用する傾向があります。Pythonの方が構文が複雑でなく、一般に学習がやや簡単です。Perl 6が利用可能になると、魅力的な開発になるでしょう。
(特に、PerlとPythonの「概要」はひどく不完全であることに注意してください。このトピックについて本全体を書くことができます。)
awk
しsed
ます(両方ともまだ用途があります)。タスクのサイズに関してsed
は、行から行へのストレージがなく、一度に1行を処理するときに最高です。 awk
多くの場合、すべてのソースから蓄積されたデータを使用して連想配列を構築するために使用されます。より多くのメモリを使用するため、大きなデータセットで問題が発生する可能性がはるかに高くなりsed
ます。tsawk
あなたがそれにリンクする前に、私は聞いたことがありません。私は、Perlに頼る傾向があります(ただし、Pythonの方が使いやすいかもしれません)awk
。
数十の言語を習得した後、S。ロットのような人々に飽きてきます(この質問に対する彼の論争の的となる回答を参照してください。回答から6年後には、投票数の半分近く(+ 45 / -22)です)。
Sedは、非常にシンプルなコマンドラインパイプラインに最適なツールです。sedマスターの手で、それは任意の複雑さの一時的なものに適していますが、非常に単純な置換パイプラインを除いて、製品コードでは使用しないでください。「s / this / that /」のようなもの。
Gawk(GNU awk)は、単一の入力ソースと単一の出力(または複数の出力が順次書き込まれる)しかない場合に、複雑なデータの再フォーマットに最適です。実際の作業の多くはこの説明に準拠しており、優れたプログラマーは2時間でgawkを学ぶことができるため、これが最良の選択です。この惑星では、シンプルで高速なほうがいいです。
PerlまたはPythonは、非常に複雑な入出力シナリオがある場合、どのバージョンのawkまたはsedよりもはるかに優れています。問題が複雑であるほど、メンテナンスと読みやすさの観点から、Pythonを使用するほうがよいでしょう。ただし、優れたプログラマーは読み取り可能なコードを任意の言語で記述でき、悪いプログラマーは保守不可能ながらくたを任意の有用な言語で記述できるため、perlまたはpythonの選択はプログラマーの設定に任せることができます。熟練して賢い。
a?ⁿaⁿ
に変更した場合、1,000,000のa??ⁿaⁿ
Perl 5でそれを実行すると、ⁿ
2秒未満で実行されます。time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'
素朴なものを実行するとⁿ
、わずか25 秒間で2秒以上かかります。Perlには、一致するものを変更する正規表現内にPerlコードを含めることができるなど、より高速な機能よりも多くの正規表現機能があることを認識してください。必要に応じて、組み込みのものを他のものと交換するモジュールを実装できます。
sedを本格的なプログラミング言語とは呼びません。これは、テキストファイルをプログラムで編集することを目的とした言語構造を持つストリームエディターです。
Awkはもう少し汎用言語ですが、それでもテキスト処理に最適です。
PerlとPythonは、本格的な汎用プログラミング言語です。Perlはテキスト処理にルーツを持ち、多くのawkに似た構成体を持っています(ネット上に浮かんでいるawk-to-perlスクリプトさえあります)。PerlとPythonの間には多くの違いがあります。おそらく、ウィキペディアのようなもので両方の言語の要約を読んで、それらが何であるかをよく理解することです。
まず、「Perl、Python awk、sed」のリストには関係のないものが2つあります。
事1-単純なテキスト操作ツール。
セド。これには、ファイルの各行を読み取って調べるという考えによって定義された、比較的単純な固定の作業範囲があります。sedは特に読みやすいようには設計されていません。それは非常に小さなUNIXサーバー上で非常に小さく、非常に効率的になるように設計されています。
awk。作業範囲がやや固定的で単純ではありません。ただし、awkプログラムのメインループは、ソースファイルの行の暗黙的な読み取りによって定義されます。
これらは「完全な」プログラミング言語ではありません。awkでかなり洗練されたプログラムを書くこともできますが、複雑になって読みにくくなります。
Thing 2-汎用プログラミング言語。これらには、さまざまな種類のステートメント、多数の組み込みデータ構造があり、ワイヤードインの仮定や、話すショートカットはありません。
Perl。
Python。
それらをいつ使用するか。
セド。決して。32Kを超えるメモリを搭載した現代のコンピュータでは、これはまったく価値がありません。PerlまたはPythonは同じことをより明確に行います。
awk。決して。sedと同様に、それはコンピューティングの初期の時代を反映しています。(成功するシステムに必要な他のすべてに加えて)この言語を維持するのではなく、単純にすべてを1つの快適な言語で行うほうが楽しいです。
Perl。あらゆる種類のプログラミング問題。同じことをする方法がたくさんある、自由に考えられる構文が好きなら、perlは楽しいです。
Python。あらゆる種類のプログラミング問題。かなり限定された構文が好きで、選択肢が少なく、微妙さが少なく、(おそらく)より明確である場合。Pythonのオブジェクト指向の性質により、Pythonは大きくて複雑な問題により適しています。
背景-私はsedを打ちのめしたり、無知から気を悪くしたりしていません。20年以上前にawkを学びました。それで多くのことをしました。コアUNIXスキルとしてそれを教えるために使用されます。私は約15年前にPerlを学びました。それで多くの洗練された事をしました。Pythonで同じことができるので、両方とも置き忘れました-そして、それはよりシンプルでより明確です。
sedとawkには2つの深刻な問題があり、どちらも年齢ではありません。
それらの実装の不完全さ。sedやawkが行うことはすべて、PythonまたはPerlで行うことができます。シェルパイプラインは、そのマルチプロセッシングのため、いくつかのパフォーマンス上の利点があります。Pythonには、subprocess
これらの利点を回復するためのモジュールが用意されています。
さらに別の言語を学ぶ必要性。Python(またはPerl)で物事を行うことにより、実装はより少ない言語に依存し、結果として明快さが向上します。
それらをいつ使用するか:awk-決して-S. Lott。
S. Lottは、この推奨事項でわずかに足りなかったと思います。Linuxと他のUNIX環境では、awkはbash、sh、kshと一緒に使用してテキストをすばやく処理できる便利なツールです。スクリプト自体のアイデアは、このツール、そのツールを一緒に接着することで問題を解決することです。したがって、管理スクリプトでは、ls、grep、|、awk、time、psなどを使用するのが一般的です。それぞれが、スクリプトを作成者がレンガごとに組み合わせて、建物を完成させる(手元の問題を解決する)ツールです。 。
たとえば、私はペイントボールのギア用品を管理するチームのチームメンバーです。dotcom。このeコマースサイトは、LAMPスタックに基づいています。さまざまなサプライヤーからのバックエンドデータベースへのデータフィードの自動処理と正規化のために、bash、perl、php、expectなどの多様なスクリプトの組み合わせを採用および維持しています。それぞれに、使用可能なモジュールとAPIに基づいた長所があります。bashスクリプトでは、PERLに切り替える必要なく、awkを使用して、必要に応じてパターンのクイックマッチングとパターンに対する適切なアクションを実行します。私が指摘したいことの1つは、スレッドでは強調されていませんが、これらのスクリプトのかなりの数が購入されたか、オープンソースから取得されたことです。スクリプトがPerlとして提供された場合は、Perlとして維持します。スクリプトがPhpとして提供された場合、Phpとして維持します。bashとして来た場合は、bashとして維持します。
ls
ず、代わりにglobを使用してください。これを読む。