正規表現スタイルのパターンマッチングを使用する多くのツールのg
オプション(例:s/pattern/replacement/g
)と、ed
、ex
、vi
、およびvim
の:g
コマンドの使用法と意味は非常に似ています:指定された正規表現に一致する "グローバルに」、つまり、最初の試合の後で停止しないでください。
これについて2つの質問があります。
:g
コマンドとg
パターンマッチングフラグのどちらが最初に来ましたか、そしてどのツールで?パターンマッチングでsed
フラグを使用するほとんどのツール(g
など)は、実際には直接または間接的にed
をエミュレートしているようです。たとえば、Perl後の時代では、正規表現を使用するほとんどのツールは、Perlが許可するためg
フラグを許可し、Perlは、ed
-> sed
-> Perl
のために許可します。したがって、「元のed
ツールで同時に導入され、それ以上の歴史的な前例がない」という答えが出ても驚かないでしょう。global
オプション(またはコマンド)と呼ばれるのはなぜですか?それについて「グローバル」なものは実際にはありません。 :g
コマンドは、他のed
コマンドと同じように行の範囲を取り、g
フラグは、検索の範囲を拡張しません(複数のヒットを許可するだけです)。 betterの名前は思いつかないと思いますが、選んだ名前は奇妙に思えるので、何か理由があるのではないかと思います。viは ex に触発され、 ex は ed に触発され、 ed は qed に触発されます
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はそれを彼に残しました翌朝デスク)
両方ともed
、またはおそらくQED
の一部として同時に来たと思います。それらはed
の使用法のかなり基本的なものです。両方がないバージョンがあったとしたら、それがどのように機能するか想像できません。
g//
と//g
はまったく異なるものです。そして、実際にはここでいくつかのことが起こっています。
//
は、パターンを含むファイル内の次の行を検索するためのものであり、1行しか返すことができません(1,$/./
は無効であることに注意してください)。g//
は、複数行、デフォルトではすべて、または指定された範囲のパターンを検索するためのものです。複数行を返すことができます。//g
だけでは意味がなく、ed
では有効なコマンドではありません(他のエンジンはそれを受け入れますが、機能的には//
と同じです)。s//
は、現在の(または指定された)行のパターンの最初のインスタンスを置き換えるためのものです。s//g
は、現在の(または指定された)行のパターンのすべてのインスタンスを置き換えるためのものです。これにより、混乱が少なくともある程度解消されることを願っています。しかし、あなたの質問に対する答えの要点は、それらが2つの異なるものであるということだと思います。それぞれが異なる理由で使用され、異なる意味を持ちます。