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 sed
den Musterbereich angewendet , bei dem es sich um eine Zeichenfolge handelt, die (standardmäßig) durch jedes \n
bei 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 sed
Befehlssyntax 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 sed
es sich nicht nur um ein Programm handelt, sondern die kompilierte ausführbare Datei, die sed
auf 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 sed
Spezifikation:
Das sed
Dienstprogramm 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, sed
kö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 P
Zeichen.
s//&+pc/3
- Wenden Sie den zuletzt verwendeten regulären Ausdruck erneut auf den aktuellen Musterraum an und ersetzen Sie das
3
dritte Vorkommen eines Musters im Musterraum durch sich &
selbst, gefolgt von der angehängten Zeichenfolge +pc
.
Und so sed
schreibt 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 dc
Taschenrechner zitiert Zeichenfolgen in seiner Eingabe in eckigen Klammern, und der P
Befehl druckt beide die Oberseite des Stapels, ohne eine \n
neue Zeile anzuhängen, und entfernt diese anschließend vom Eingabestapel.
Wenn Sie also die erste Zeile als Beispiel verwenden, reicht dc
dies aus:
[2015-01 ]P
P
rint und platzen Sie die Oberseite des Stapels
5000
- Schieben Sie die Zahl oben
5000
auf 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
p
Drucken Sie die Oberseite des Stapels, gefolgt von einer angehängten \n
Ewline, ohne sie vom Stapel zu entfernen.
c