Die g
Option (zB s/pattern/replacement/g
) für viele Werkzeuge , dass die Verwendung Regex-Stil Pattern Matching und der :g
Befehl in ed
, ex
, vi
, und vim
haben 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
:g
Befehl oder dasg
Mustervergleichsflag und in welchem Tool? Es sieht so aus, als ob die meisten Tools (z. B.sed
), die dasg
Flag für die Mustererkennung verwenden, nur direkt oder indirekt emulierened
. Zum Beispiel erlauben im Post-Perl-Zeitalter die meisten Tools, die Regex verwenden, dasg
Flag, weil Perl dies tut, und Perl, wie es scheint, tut es, weiled
->sed
->Perl
. Es würde mich also nicht wundern, wenn die Antwort lautet: "Sie wurden gleichzeitig in das ursprünglicheed
Tool eingeführt und haben darüber hinaus keinen historischen Präzedenzfall." - Warum wird dies als
global
Option (oder Befehl) bezeichnet? Es ist wirklich nichts "Globales" daran; Der:g
Befehl nimmt wie jeder andereed
Befehl eine Reihe von Zeilen ein , und dasg
Flag 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.
sed
regular-expression
history
ed
Kyle Strand
quelle
quelle
g
Befehl ed (1) ist insofern global, als er einen (normalerweise einzeiligen) Befehl auf mehrere Zeilen anwendet .Antworten:
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 (
G
global,re
regulärer Ausdruck,P
print) in qed benannt. Dieser Befehl wurde verwendetG/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)quelle
qed
tatsächlich auch deng
Befehl.ex(1)
ist der Erbe (Herausgeber Linie)ed(1)
,vi(1)
ist nur der vi sual (Vollbild) Schnittstelle zuex(1)
. Sie könnten von Ex zu Visual wechseln, es handelte sich um Aliase (normalerweise/usr/bin/vi
und/usr/bin/ex
als 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:
Befehlevi
sindex
Befehle.Ich glaube, sie kamen beide zur gleichen Zeit als Teil von
ed
oder möglicherweiseQED
. Sie sind ziemlich grundlegend für die Verwendung voned
. Wenn es jemals eine Version gäbe, die nicht beides hätte, kann ich mir nicht vorstellen, wie es funktionieren würde.g//
und//g
sind 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, der1,$/./
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.//g
allein ist bedeutungslos und kein gültiger Befehl ined
(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.
quelle
qed
hatte keine Regex-Unterstützung; Das war (nach ein paar verschiedenen Versionen der Geschichte) der primäre Sprung nach vorneed
. 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.g
der 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).:20,200g/today/s/month/February/g
...