Regex `/ pattern / g` und ed`: g / pattern /`: was zuerst kam und warum `g`?

7

Die gOption (zB s/pattern/replacement/g) für viele Werkzeuge , dass die Verwendung Regex-Stil Pattern Matching und der :gBefehl in ed, ex, vi, und vimhaben ziemlich ähnliche Nutzung und Bedeutung: erfüllt die regex „global“, das heißt, nicht aufhören nach dem ersten Spiel.

Ich habe eine zweifache Frage dazu:

  • Was war zuerst da, der :gBefehl oder das gMustervergleichsflag und in welchem ​​Tool? Es sieht so aus, als ob die meisten Tools (z. B. sed), die das gFlag für die Mustererkennung verwenden, nur direkt oder indirekt emulieren ed. Zum Beispiel erlauben im Post-Perl-Zeitalter die meisten Tools, die Regex verwenden, das gFlag, weil Perl dies tut, und Perl, wie es scheint, tut es, weil ed-> sed-> Perl. Es würde mich also nicht wundern, wenn die Antwort lautet: "Sie wurden gleichzeitig in das ursprüngliche edTool eingeführt und haben darüber hinaus keinen historischen Präzedenzfall."
  • Warum wird dies als globalOption (oder Befehl) bezeichnet? Es ist wirklich nichts "Globales" daran; Der :gBefehl nimmt wie jeder andere edBefehl eine Reihe von Zeilen ein , und das gFlag erweitert den Suchbereich in keiner Weise (es erlaubt nur mehrere Treffer). Ich denke, ich kann mir keinen besseren Namen vorstellen , aber der Auserwählte scheint mir nur seltsam, also frage ich mich, ob es einen Grund dafür gibt, den ich nicht sehe.
Kyle Strand
quelle
2
qed hatte einen G-Befehl und sein S-Befehl hatte kein ag-Flag. Es sieht so aus, als ob das Verhalten des S-Befehls das gleiche war wie das, was wir als eds Befehl mit dem g-Flag kennengelernt haben. cm.bell-labs.com/who/dmr/qedman.html sagt für den S-Befehl: "Vorkommen von <regexp> in den adressierten Zeilen werden durch <string> ersetzt"
Mark Plotnick,
@ MarkPlotnick Nun, das beantwortet Teil eins! Schön gemacht.
Kyle Strand
Der gBefehl ed (1) ist insofern global, als er einen (normalerweise einzeiligen) Befehl auf mehrere Zeilen anwendet .
vonbrand

Antworten:

7

vi ist inspiriert von ex , ex ist inspiriert von ed , ed ist inspiriert von qed

QED wurde bereits Ende der 1960er Jahre von Ken Thompson für das "Compatible Time-Sharing System" des MIT (eine frühere Version des Berkeley Timesharing-Systems wurde von Butler Lampson, L. Peter Deutsch und Dana Angluin erstellt) - kurz Thompson - zusammen gehackt Regex in Qed hinzugefügt (er hat viel mehr als das getan, aber es liegt außerhalb des Rahmens dieser Antwort. - Bell Labs hat mehr über die Geschichte von QED )

Ein Befehl in qed war der Befehl "G" oder "Global". Sie konnten alle Zeilen in der Datei gleichzeitig bearbeiten (die vorherige Version von qed war zeichenorientiert statt zeilenorientiert.)

Grep ist tatsächlich nach einer der Verwendungen dieses Befehls G / re / P ( Gglobal, reregulärer Ausdruck, Pprint) in qed benannt. Dieser Befehl wurde verwendet G/bash/P, um alle Zeilen auszudrucken, die das Wort bash enthalten - dies wurde später in ed aufgenommen aus ed herausgenommen und zu einer eigenständigen Funktion gemacht (laut Doug McIlroy bat er Ken, es für ihn zu tun und Ken ließ es am nächsten Morgen auf seinem Schreibtisch liegen)

JKirchartz
quelle
Wie Mark Plotnick in seinem Kommentar zu der Frage hervorhob, hatte er qedtatsächlich auch den gBefehl.
Kyle Strand
Falsch. ex(1)ist der Erbe (Herausgeber Linie) ed(1), vi(1)ist nur der vi sual (Vollbild) Schnittstelle zu ex(1). Sie könnten von Ex zu Visual wechseln, es handelte sich um Aliase (normalerweise /usr/bin/viund /usr/bin/exals Hardlinks, wobei das Programm je nach dem Namen, mit dem es aufgerufen wird, im einen oder anderen Modus startet). Noch heute hat vim (VI iMproved, keine Beziehung zum Originalcode), das auf Fedora installiert ist /usr/bin/ex, einen Symlink zu /usr/bin/vi. Die :Befehle visind exBefehle.
vonbrand
4

Ich glaube, sie kamen beide zur gleichen Zeit als Teil von edoder möglicherweise QED. Sie sind ziemlich grundlegend für die Verwendung von ed. Wenn es jemals eine Version gäbe, die nicht beides hätte, kann ich mir nicht vorstellen, wie es funktionieren würde.

g//und //gsind zwei völlig verschiedene Dinge. Und hier sind tatsächlich mehrere Dinge im Gange.

  • //Für die Suche nach der nächsten Zeile in der Datei, die das Muster enthält, kann nur eine einzelne Zeile zurückgegeben werden (Hinweis, der 1,$/./ungültig ist).
  • g//dient zur Suche nach einem Muster in mehreren Zeilen, standardmäßig in allen oder in einem bestimmten Bereich. Es können mehrere Zeilen zurückgegeben werden.
  • //gallein ist bedeutungslos und kein gültiger Befehl in ed(obwohl einige andere Engines ihn akzeptieren, ist er funktional genauso wie //sowieso).
  • s// dient zum Ersetzen der ersten Instanz eines Musters in der aktuellen (oder angegebenen) Zeile (n).
  • s//g dient zum Ersetzen aller Instanzen eines Musters in der aktuellen (oder angegebenen) Zeile (n).

Ich hoffe, dass dies die Verwirrung zumindest etwas aufklärt. Aber ich denke, der Hauptpunkt der Antwort auf Ihre Frage ist, dass dies zwei verschiedene Dinge sind. Jedes wird aus einem anderen Grund verwendet und bedeutet unterschiedliche Dinge.

Bahamat
quelle
Erstens qedhatte keine Regex-Unterstützung; Das war (nach ein paar verschiedenen Versionen der Geschichte) der primäre Sprung nach vorne ed. Ich bin mir also nicht sicher, was Sie damit meinen, dass Sie sich nicht vorstellen können, wie ein solcher Editor "funktionieren würde", da es viele andere Bearbeitungsbefehle gibt.
Kyle Strand
Zweitens bin ich mir der Unterschiede bewusst, und ich denke, meine Frage weist auf dieses Bewusstsein hin. Insbesondere sagte ich, dass die beiden Dinge "eine ziemlich ähnliche Verwendung und Bedeutung haben". Dies ist vermutlich der Grund, warum sie denselben Buchstaben verwenden, obwohl in einem Fall gder Befehlsname (und in der Hilfedokumentation explizit mit "global" abgekürzt) und in dem anderen Fall ein Flag (und soweit ich weiß) wird in keiner Editor-Dokumentation ausdrücklich als Abkürzung für "global" bezeichnet (obwohl beispielsweise Programming Perl diese Zuordnung herstellt).
Kyle Strand
Wie auch immer, danke für Ihre Erklärung einiger der verschiedenen Möglichkeiten, wie Regex in Editorbefehlen verwendet werden kann. Ich denke, dass ich durch meine vage Terminologie den Eindruck erweckte, durch die Verwendung verwirrter zu sein als ich es tatsächlich bin, da ich tatsächlich das Gefühl habe, ein ziemlich solides Verständnis für die Verwendung von Regex in Vim, sed, Perl usw. zu haben. Ich möchte die Geschichte nur ein bisschen besser verstehen . Ich habe die ursprüngliche Frage geringfügig bearbeitet, um dies zu klären.
Kyle Strand
Beachten Sie, dass Sie zB sagen können :20,200g/today/s/month/February/g...
vonbrand