sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... druckt ...
2015-01 6000
2015-02 8000
2015-03 10000
Daher deklariere ich oben einen regulären Ausdruck, der eine Feldausdehnung definiert , die aus einer einzelnen Folge von Zeichen *variabler Länge besteht, die ^nicht <Leerzeichen> sind, unmittelbar gefolgt von einer einzelnen Folge von Zeichen *variabler Länge, die <Leerzeichen> sind . Diese Deklaration wird auf sedden Musterbereich angewendet , bei dem es sich um eine Zeichenfolge handelt, die (standardmäßig) durch jedes \nbei der Eingabe vorkommende ewline-Zeichen begrenzt ist und die bei jedem Auftreten derselben rekursiv (standardmäßig) durch die nächste ersetzt wird.
Die Schnittstelle für diese Deklaration ist zweifach und wird auf jeder Ebene von mindestens einem internationalen IEEE-Standardkomitee vollständig reguliert und spezifiziert , um eine vorhersehbare Anwendung der sedBefehlssyntax sicherzustellen . sed‚s API - Syntax , ist beispielsweise in diesem Fall mit dem angelegten Adressenbefehl/ (die immer die erste Komponente jedes ist ubstitution - Befehls) , aber der Inhalt desselben wird durch einen basischen API als Teilmenge des für die angegebene interpretiert Funktion in der Standard-C-Bibliothek ./sed s///regcomp()
Ich kann diese Aussagen sicher machen, da sedes sich nicht nur um ein Programm handelt, sondern die kompilierte ausführbare Datei, die sedauf meinem Unix-ähnlichen Computer benannt ist, eine Implementierung der genau definierten, historisch etablierten und standardgesteuerten sed Anwendung der regulären Systemfunktionen meines Systems ist. Ausdrucks-Matching-Bibliotheken.
Aus der sedSpezifikation:
Das sedDienstprogramm muss die in XBD Basic Regular Expressions beschriebenen BREs unterstützen ...
... wo wir finden ...
Beide BREs und EREs werden durch die Regular Expression Matching - Schnittstelle im System Interfaces Volumen von POSIX.1-2008 unter unterstützten regcomp(), regexec()und die damit verbundenen Funktionen.
Eine Anwendung, die aufruft regcomp(), zeigt eine Musterzeichenfolge und ...
... [d] ie regcomp()Funktion wird mit dem regulären Ausdruck in der Zeichenfolge enthalten kompilieren vom deutete auf Muster Argumente und legen Sie die Ergebnisse in der Struktur preg ...
Um darauf zu reagieren, würde sich diese Anwendung dann auf die regcomp()Begleitfunktion beziehen ...
... [t] Die regexec()Funktion vergleicht die durch string angegebene nullterminierte Zeichenfolge mit dem kompilierten regulären Ausdruck preg, der durch einen vorherigen Aufruf von regcomp()... initialisiert wurde.
... regexec()soll die Elemente eines Arrays mit Offsets der Teilzeichenfolgen des Strings füllen, die den in \(Klammern gesetzten Unterausdrücken \)des Musters entsprechen ... Muster selbst zählt als Unterausdruck ...
... [t] Die regexec()Funktion muss alle nmatch- Elemente von pmatch ausfüllen , wobei nmatch und pmatch von der Anwendung bereitgestellt werden, auch wenn einige Elemente von pmatch nicht den Unterausdrücken im Muster entsprechen .
Und wenn ich das tue ...
/[^ ]* */
... kompiliertsed zuerst den regulären Ausdruck und speichert die Ergebnisse im Speicher, wendet dann den dort gespeicherten kompilierten Automaten so oft auf den Inhalt meines Musterraums an, wie zur Erfüllung meines Befehls erforderlich ist. Jedes Mal, wenn dies der Fall ist, ist das Ergebnis ein Array von einem oder mehreren nullbegrenzten Feldern , die bei den von zurückgegebenen Offsets begrenzt sind .regexec()
Und wenn ich ...
//
... um anzuzeigen, dass der zuletzt definierte reguläre Ausdruck verwendet werden soll, sedkönnen Sie regexec()den vorkompilierten regulären Ausdruck einfach erneut aufrufen, diesmal jedoch möglicherweise auf ein geändertes Zeichenfolgenargument anwenden oder neue nmatch- Parameter anwenden , wie ich es befehle.
Genauer gesagt noch ...
s/[^ ]* */[&]P/
- Ersetzen Sie das erste Auftreten eines Musters im Musterraum durch eine
[linke eckige Klammer, dann &selbst, dann durch eine ]rechte eckige Klammer, gefolgt von einem PZeichen.
s//&+pc/3
- Wenden Sie den zuletzt verwendeten regulären Ausdruck erneut auf den aktuellen Musterraum an und ersetzen Sie das
3dritte Vorkommen eines Musters im Musterraum durch sich &selbst, gefolgt von der angehängten Zeichenfolge +pc.
Und so sedschreibt es für jede Zeile der Eingabe anhand Ihrer Beispieldaten in die Standardausgabe:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Dies mag seltsam aussehen, aber der dcTaschenrechner zitiert Zeichenfolgen in seiner Eingabe in eckigen Klammern, und der PBefehl druckt beide die Oberseite des Stapels, ohne eine \nneue Zeile anzuhängen, und entfernt diese anschließend vom Eingabestapel.
Wenn Sie also die erste Zeile als Beispiel verwenden, reicht dcdies aus:
[2015-01 ]P
Print und platzen Sie die Oberseite des Stapels
5000
- Schieben Sie die Zahl oben
5000auf den Stapel und drücken Sie alle Elemente auf dem Stapel (jetzt keine) um eins nach unten.
1000
- Das Gleiche gilt, aber diesmal wird die Zahl 5000 oben im Hauptstapel um eins nach unten gedrückt und wird zum zweiten Element auf dem Stapel.
+
- Addieren Sie die beiden obersten Zahlen auf dem Stapel, nehmen Sie beide vom Stapel und schieben Sie die Summe auf die Oberseite des Stapels.
- Dies führt zu einem Stapel, der nur aus der Zahl besteht
6000.
- Dies ist ein Syntaxfehler, wenn eines der beiden obersten Elemente auf dem Stapel eine
[Zeichenfolge ist ].
p
pDrucken Sie die Oberseite des Stapels, gefolgt von einer angehängten \nEwline, ohne sie vom Stapel zu entfernen.
c