sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... impressions ...
2015-01 6000
2015-02 8000
2015-03 10000
Donc, ci-dessus, je déclare une expression régulière qui définit une étendue de champ qui se compose d'une séquence unique de *
longueur variable de caractères qui ^
ne sont pas <espace> suivie immédiatement d'une séquence unique de *
longueur variable de caractères qui sont <espace> . Cette déclaration est appliquée à sed
l'espace de modèle de, qui est une chaîne délimitée (par défaut) par chaque \n
caractère ewline qui se produit en entrée, et qui est récursivement remplacée (par défaut) par la suivante pour chaque occurrence de celui-ci.
L'interface de cette déclaration est double et à chaque niveau est entièrement réglementée et spécifiée par au moins un comité international de normalisation officiel de l'IEEE pour assurer une application prévisible de la sed
syntaxe de commande. sed
La syntaxe de l'API , par exemple, est appliquée dans ce cas avec la commande d' /
adresse (qui est toujours le premier composant de toute commande d'ubstitution) , mais son contenu est interprété par une API plus basique comme un sous-ensemble de celui spécifié pour le dans la bibliothèque C standard ./
sed s///
regcomp()
Je peux faire ces déclarations en toute confiance, car ce sed
n'est pas seulement un programme, mais plutôt l'exécutable compilé nommé sed
sur ma machine de type Unix est une implémentation de l'application bien définie, historiquement établie et contrôlée par les normes de l' sed
application régulière de mon système. bibliothèques de correspondance d'expression.
De la sed
spécification:
L' sed
utilitaire doit prendre en charge les BRE décrits dans XBD Basic Regular Expressions ...
... où l'on trouve ...
Les deux BREs et ERE sont pris en charge par l'interface de correspondance d'expression régulière dans le volume Interfaces système de POSIX.1-2008 sous regcomp()
, regexec()
et les fonctions connexes.
Une application qui appelle lui regcomp()
présentera une chaîne de motif et ...
... [la] regcomp()
fonction doit compiler l'expression régulière contenue dans la chaîne pointée par l' argument pattern et placer les résultats dans la structure preg ...
Pour agir sur ce point, ladite application ferait alors référence à regcomp()
la fonction compagnon de ...
... [la] regexec()
fonction compare la chaîne terminée par un caractère nul spécifiée par string avec l'expression régulière compilée preg initialisée par un appel précédent à regcomp()
...
... regexec()
doit remplir les éléments d'un [tableau] avec des décalages des sous-chaînes de chaîne qui correspondent aux \(
sous \)
- expressions entre parenthèses du motif ... le motif lui-même compte comme une sous-expression ...
... [la] regexec()
fonction doit remplir tous les éléments nmatch de pmatch , où nmatch et pmatch sont fournis par l'application, même si certains éléments de pmatch ne correspondent pas à des sous-expressions dans le motif .
Et donc quand je le fais ...
/[^ ]* */
... compile d'sed
abord l'expression régulière et stocke les résultats en mémoire, puis applique ensuite l'automate compilé qui y est stocké au contenu de mon espace modèle autant de fois que nécessaire pour exécuter ma commande. Chaque fois qu'il le fait, le résultat est un tableau d'un ou plusieurs champs délimités par des valeurs nulles comme délimité au niveau des décalages renvoyés par .regexec()
Et quand je le fais ...
//
... pour indiquer que l'expression régulière définie le plus récemment doit être utilisée, sed
il suffit d'appeler à regexec()
nouveau en réutilisant l'expression régulière précompilée, mais éventuellement en l'appliquant cette fois à un argument de chaîne modifié ou en appliquant de nouveaux paramètres nmatch comme commande I.
Plus précisément encore ...
s/[^ ]* */[&]P/
- remplacer la première occurrence de motif dans l'espace de motif par un
[
crochet carré gauche, puis &
lui-même, puis un ]
crochet carré droit suivi d'un P
caractère.
s//&+pc/3
- appliquez à nouveau la dernière expression régulière utilisée à l'espace de motif actuel et remplacez la
3
troisième occurrence de motif dans l'espace de motif par &
elle-même suivie de la chaîne ajoutée +pc
.
Et donc pour chaque ligne d' sed
entrée, il écrit dans sa sortie standard, étant donné vos données d'exemple:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Cela peut sembler étrange, mais la dc
calculatrice cite des chaînes dans son entrée entre crochets, et la P
commande imprimera à la fois le haut de la pile sans ajouter de ligne \n
électronique et ensuite la fera disparaître de la pile d'entrée.
Et donc, en utilisant la première ligne comme exemple, dc
cela fera:
[2015-01 ]P
P
rint et pop le haut de la pile
5000
- Poussez le numéro en
5000
haut de la pile et poussez tous les éléments actuellement sur la pile (maintenant aucun) vers le bas.
1000
- idem, mais cette fois le nombre 5000 en haut de la pile principale est poussé vers le bas par un, et devient le deuxième élément de la pile.
+
- Ajoutez les deux premiers chiffres de la pile ensemble, sortez les deux de la pile et poussez la somme en haut de la pile.
- Il en résulte une pile composée uniquement du nombre
6000
.
- Il s'agit d'une erreur de syntaxe si l'un des deux premiers éléments de la pile est une
[
chaîne ]
.
p
p
imprimer le haut de la pile suivi d'une ligne \n
électronique ajoutée sans la faire sauter hors de la pile.
c