Questo documento sfrutta i fogli di stile (CSS); senza il supporto dei fogli di stile, benché il testo sia comunque visualizzabile, non saranno visibili ne le formattazioni ne la struttura della pagina.

Sommario    Precedente    Successivo

Guida sistematica a SED - parte 01

Gli script annidati

Contenuti della Sezione

  1. Gli script annidati
    1. Gli adress numero di riga negli scriprt annidati

L'adress di uno script serve a selezionare le righe su cui SED eseguirà una o più istructions.

Dal punto di vista logico si può affermare che grazie all'adress è estratto dallo stream di input un insieme di righe di testo; insieme sul quale è possibile operare una ulteriore selezione, estraendo un sottoinsime delle righe precedentemente selezionate; su tale sottoinsime è a sua volta possibile fare un altra selezione ed estrarre un ulteriore sottoinsieme.

Lo scopo degli script annidati è proprio quello di operare delle selezioni successive, partendo dall'insieme di righe che compongono l'intero file.

Gli adress descrivono, in sostanza, la proprietà caratteristica delle righe che faranno parte dell'insieme e dei successivi sottoinsiemi individuati.

La sintassi è molto simile a quella dela raggruppamento di istructions sotto un medesimo adress.

Modello di annidamento
sed [opzioni] file_da_processare -e adress1{
istruction1
adress2{
 istruction2.1
 istruction2.2
}
adress3{
 adress4{
  istruction3.4.1
  istruction3.4.2
 }
}
}

In questo modello di annidamento adress1, quello posto subito dopo l'opzione -e, effettua la prima selezione di un gruppo di righe; su questo insieme saranno eseguite le istruzioni o le ulteriore selezioni contenute all'interno della prima parentesi graffa aperta.

SED opera riga per riga, nel senso che applica tutti gli script sulla riga memorizzata in un dato momento nel pattern space e solo dopo carica nel pattern space la riga successiva.

Quindi, seguendo il modello, se la riga nel pattern space verifica la corrispondenza con adress1, su di essa sarà seguita per prima istruction1, che potrà modificare la riga; successivamente, su tale riga eventualmente modificata, sarà verificato adress2.

Se la verifica di adress2 è positiva, su quella riga sarà eseguita prima istruction2.1 e poi istruction2.2.

A questo punto SED verifica se la riga eventualmente modificata dalle istructions eseguite precedentemente corrisponde ad adress3 e in caso positivo, opera una ulteriore e immediata verifica di corrispondenza con adress4.

Se la corrispondenza con adress4 è positiva, vengono eseguite istruction3.4.1 ed istruction3.4.2, dopo di che sul pattern space viene caricata la riga successiva ed il ciclo riparte da capo.

Questo meccanismo, anche se in modo un po particolare, consente comunque di selezionare e alterare un insieme di righe e successvamente di selezioanre ed alterare sottoinsiemi dell'insieme immediatamente precedente.

In paratica, sempre nel modello, le istructions di adress2 saranno eseguite solo se la riga corrisponde sia ad adress1 che ad adress2 e quindi, ragionando in termini insiemistici, se la riga ha le proprietà caratteristiche descritte sia nel primo che nel secondo adress.

Allo stesso modo le istructions di adress4 saranno eseguite se la riga corrisponde ad adress1, ad adress3 e ad adress4 e quindi, ragionando in termini insiemistici, se la riga ha le proprietà caratteristiche descritte nel primo, nel terzo e nel quarto adress (il quarto adress è annidato al terzo, il terzo è annidato al primo).

Gli adress numero di riga negli scriprt annidati

Una precisazione è necessaria sulla tipologia di adress da utilizzare nell'ambito degli script annidati.

Indubbiamente l'adress di tipo regexp è utilizzabile nel primo adress e nei successivi adress annidati al primo: le selezioni in tal caso saranno effettuate sulla base delle corrispondenze con i diversi modelli regexp

Discorso diverso va fatto per gli adress numero di riga; tale numero è infatti determinato contando le righe dello stream di input partendo dalla prima alla quale è assegnato l'ordinale 1; l'ordinale identifica la riga in modo assoluto rispetto alla posizione della stessa nello stream di input.

Utilizzare un adress di tipo numero di riga come primo adress di uno script che ne annida altri, non comporta problemi.

I problemi nascono rispetto agli adress successivi al primo; infatti la numerazione delle righe rimane sempre riferita alla posizione della riga rispetto allo stream di input; tale numerazione non viene ricalcolata in relazione alla posizione della riga nell'insieme precedentemente selezionato.

Esempio: La numerazione è sempre assoluta rispetto allo stream di input
sed -n myfile.txt -e '4,10{
1,3p
}'