sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... stampe ...
2015-01 6000
2015-02 8000
2015-03 10000
Quindi sopra dichiaro un'espressione regolare che definisce un'estensione di campo che consiste in una singola sequenza di caratteri *
a lunghezza variabile che ^
non sono <spazio> seguita immediatamente da una singola sequenza di caratteri *
a lunghezza variabile che è <spazio> . Questa dichiarazione viene applicata allo sed
spazio del modello, che è una stringa delimitata (per impostazione predefinita) da ciascun \n
carattere di ewline presente nell'input e che viene ricorsivamente sostituita (per impostazione predefinita) con la successiva per ogni occorrenza della stessa.
L'interfaccia per questa dichiarazione è duplice, e ad ogni livello è completamente regolata e specificata da almeno un comitato internazionale di standard ufficiali IEEE per garantire un'applicazione prevedibile della sed
sintassi dei comandi. sed
La sintassi dell'API , ad esempio, viene applicata in questo caso con il comando /
address (che è sempre il primo componente di qualsiasi comando ubstitution) , ma il contenuto dello stesso viene interpretato da un'API più semplice come un sottoinsieme di quello specificato per il funzione nella libreria C standard ./
sed s///
regcomp()
Posso fare queste affermazioni con fiducia, perché sed
è non è solo un programma, ma, piuttosto, il file eseguibile compilato chiamato sed
sul mio Unix-like macchina è un'implementazione del ben definito, storicamente consolidata, e gli standard-controllato sed
applicazione della regolarizzazione del mio sistema librerie corrispondenti all'espressione.
Dalle sed
specifiche:
L' sed
utilità deve supportare i BRE descritti nelle espressioni regolari di base XBD ...
... dove troviamo ...
Entrambi BRE e ERE sono supportate dall'interfaccia espressione corrispondente regolare il volume Interfacce Sistema di POSIX.1-2008 sotto regcomp()
, regexec()
e funzioni relative.
Un'applicazione che chiama regcomp()
le presenterà una stringa di pattern e ...
... [t] la sua regcomp()
funzione deve compilare l'espressione regolare contenuta nella stringa indicata dall'argomento pattern e posizionare i risultati nella struttura preg ...
Per agire in tal senso, detta applicazione si riferirà quindi alla regcomp()
funzione di accompagnamento ...
... [i] regexec()
funzione confronta la stringa con terminazione null specificato dalla stringa con l'espressione regolare compilata preg inizializzato da una precedente chiamata a regcomp()
...
... regexec()
deve riempire gli elementi di [un] array con offset delle sottostringhe di stringa che corrispondono alle \(
sottoespressioni tra parentesi \)
del modello ... il modello stesso conta come una sottoespressione ...
... [t] la sua regexec()
funzione deve compilare tutti gli elementi nmatch di pmatch , dove nmatch e pmatch sono forniti dall'applicazione, anche se alcuni elementi di pmatch non corrispondono a sottoespressioni nel modello .
E così quando lo faccio ...
/[^ ]* */
... sed
prima compila l'espressione regolare e memorizza i risultati in memoria, quindi applica l'automa compilato memorizzato lì al contenuto del mio spazio-modello quante volte è necessario per adempiere al mio comando. Ogni volta che lo fa il risultato è una matrice di uno o più campi delimitati da null come delimitati dagli offset restituiti da regexec()
.
E quando lo faccio ...
//
... per indicare che è necessario utilizzare l'espressione regolare definita più di recente, è sed
possibile chiamare regexec()
nuovamente riutilizzando l'espressione regolare precompilata, ma eventualmente applicandola questa volta a un argomento stringa modificato o applicando nuovi parametri nmatch come comando.
Più specificamente ancora ...
s/[^ ]* */[&]P/
- sostituisci la prima occorrenza del modello nello spazio del modello con una
[
parentesi quadra sinistra, quindi &
stessa, quindi una ]
parentesi quadra destra seguita da un P
carattere.
s//&+pc/3
- applicare di nuovo l'ultima espressione regolare utilizzata allo spazio di pattern corrente e sostituire la
3
terza occorrenza di pattern nello spazio di pattern con &
se stessa seguita dalla stringa aggiunta +pc
.
E così per ogni riga di sed
input scrive nel suo stdout, dati i tuoi dati di esempio:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Questo potrebbe sembrare strano, ma la dc
calcolatrice cita le stringhe nel suo input tra parentesi quadre e il P
comando stamperà entrambi la parte superiore dello stack senza aggiungere una \n
ewline e successivamente lo farà uscire dallo stack di input.
E così, usando la prima riga lì come esempio, dc
farà:
[2015-01 ]P
P
rint e pop la cima dello stack
5000
- Spingi il numero
5000
in cima allo stack e spingi tutti gli elementi attualmente nello stack (ora nessuno) di uno.
1000
- idem, ma questa volta il numero 5000 nella parte superiore della pila principale viene spinto verso il basso di uno e diventa il secondo elemento sulla pila.
+
- Aggiungi i primi due numeri nello stack insieme, fai saltare entrambi quelli fuori dallo stack e spingi la somma in cima allo stack.
- Ciò si traduce in uno stack costituito solo dal numero
6000
.
- Questo è un errore di sintassi se uno dei primi due elementi nello stack è una
[
stringa ]
.
p
p
stampare la parte superiore dello stack seguita da una \n
ewline aggiunta senza farla fuoriuscire dallo stack.
c