web-dev-qa-db-ja.com

正規表現 `/ pattern / g`とed`:g / pattern /`:どちらが最初に来たのか、そしてなぜ `g`?

正規表現スタイルのパターンマッチングを使用する多くのツールのgオプション(例:s/pattern/replacement/g)と、edexvi、およびvim:gコマンドの使用法と意味は非常に似ています:指定された正規表現に一致する "グローバルに」、つまり、最初の試合の後で停止しないでください。

これについて2つの質問があります。

  • :gコマンドとgパターンマッチングフラグのどちらが最初に来ましたか、そしてどのツールで?パターンマッチングでsedフラグを使用するほとんどのツール(gなど)は、実際には直接または間接的にedをエミュレートしているようです。たとえば、Perl後の時代では、正規表現を使用するほとんどのツールは、Perlが許可するためgフラグを許可し、Perlは、ed-> sed-> Perlのために許可します。したがって、「元のedツールで同時に導入され、それ以上の歴史的な前例がない」という答えが出ても驚かないでしょう。
  • これがglobalオプション(またはコマンド)と呼ばれるのはなぜですか?それについて「グローバル」なものは実際にはありません。 :gコマンドは、他のedコマンドと同じように行の範囲を取り、gフラグは、検索の範囲を拡張しません(複数のヒットを許可するだけです)。 betterの名前は思いつかないと思いますが、選んだ名前は奇妙に思えるので、何か理由があるのではないかと思います。
7
Kyle Strand

viは ex に触発され、 exed に触発され、 edqed に触発されます

QEDは、MITの「互換性のあるタイムシェアリングシステム」(バークレータイムシェアリングシステムの以前のバージョンはバトラーランプソン、L。ピータードイチュ、ダナによって作成された)のために1960年代後半に ケントンプソン によって一緒にハッキングされましたAngluin)—要するに、トンプソンはqedに正規表現を追加しました(彼はそれ以上のことをしましたが、それはこの回答の範囲外です。-- Bell LabsはQEDの歴史についてもっと詳しく説明しています

1つの qedのコマンド は「G」または「グローバル」コマンドでした。これにより、ファイル内のすべての行を一度に操作できました(以前のバージョンのqedは、行指向ではなく文字指向でした)。

Grepは、実際には、このコマンドG/re/P(G global、re正規表現、P print)の使用法の1つにちなんで名付けられています。このコマンドは次のように使用されました。 G/bash/P Word bashを含むすべての行を印刷する—これは後でedに含まれ、次にedから取り出されてスタンドアロン関数になりました(Doug McIlroyによると、彼はKenにそれを行うように依頼し、Kenはそれを彼に残しました翌朝デスク)

7
JKirchartz

両方ともed、またはおそらくQEDの一部として同時に来たと思います。それらはedの使用法のかなり基本的なものです。両方がないバージョンがあったとしたら、それがどのように機能するか想像できません。

g////gはまったく異なるものです。そして、実際にはここでいくつかのことが起こっています。

  • //は、パターンを含むファイル内の次の行を検索するためのものであり、1行しか返すことができません(1,$/./は無効であることに注意してください)。
  • g//は、複数行、デフォルトではすべて、または指定された範囲のパターンを検索するためのものです。複数行を返すことができます。
  • //gだけでは意味がなく、edでは有効なコマンドではありません(他のエンジンはそれを受け入れますが、機能的には//と同じです)。
  • s//は、現在の(または指定された)行のパターンの最初のインスタンスを置き換えるためのものです。
  • s//gは、現在の(または指定された)行のパターンのすべてのインスタンスを置き換えるためのものです。

これにより、混乱が少なくともある程度解消されることを願っています。しかし、あなたの質問に対する答えの要点は、それらが2つの異なるものであるということだと思います。それぞれが異なる理由で使用され、異なる意味を持ちます。

4
bahamat