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

Le istructions per l'inserimento o l'aggiunta del testo in fase di output

Contenuti della Sezione

  1. Le istructions per l'inserimento o l'aggiunta del testo in fase di output
    1. Concetti generali sulle istructions \i ed \a
    2. La sintassi delle istructions e gli adress utilizzabili
    3. Il funzionamento in dettaglio delle istructions i\ ed a\

Concetti generali sulle istructions \i ed \a

L'istructions i\ comporta l'inserimento di testo all'inizio.

L'istructions a\ comporta l'aggiunta di testo alla fine.

L'utilizzo dei termini inserimento di testo all'inizio e aggiunta del testo alla fine può essere fuorviante, ed è quindi necessario precisare quali sono gli effetti di tali istructions.

Nessuna delle due istruction, infatti, modifica il pattern space, nel senso che l'istructions i\ non inserisce all'inzio del pattern space una ulteriore stringa di testo e l'istructions a\ non aggiunge alla fine del pattern space un ulteriore stringa di testo.

Le due istructions agiscono esclusivamente in fase di output.
Questo dettaglio è di fondamentale importanza, perché le istructions successive ad i\ oppure ad a\, da eseguire sulla medesima riga nel pattern space, non saranno condizionate dal testo da esse inserito o aggiunto.

La sintassi delle istructions e gli adress utilizzabili

La sintassi generale delle istructions è il segunete.

Modello generale per le istructions \i \a
i\
prima riga di testo da inserire\
seconda riga di testo da inserire\
.....\
ultima riga di testo da inserie

a\
prima riga di testo da aggiungere\
seconda riga di testo da aggiungere\
.....\
ultima riga di testo da aggiungere

Le righe su cui eseguire le istructions possono essere selezionate attraverso l'utilizzo di un address posto prima del simbolo i\ o a\ senza spazi separatori.
Possono essere utilizzati adress di qualsiasi tipo.

Secondo lo standard POSIX non è ammessa l'esecuzione delle istructions i\ od a\ su un intervallo di righe.

Esempio: Non è ammesso nello standard POSIX
1,10i\
<inizio>

Questa limitazione è superata dallo standard GNU.
In pratica il testo viene inserito o aggiunto, secondo le regole che vedremo in seguito, per ogni riga compresa nell'intervallo selezionato.

Il testo da inserire o aggiungere può stare su una o più righe; se sta su più righe, in corrispondenza di ogni backslash \, sarà inviato un newline in fase di output.

L'ultima riga da inserire o aggiungere non termina mai con un backslash. (se il testo da inserire o aggiungere sta solo su una riga, allora quell'unica riga non dovrà terminare con un backslash)

Altro aspetto della sintassi è che dopo il simbolo dell'istructions i od a vi deve essere un backslash ed il testo da inserire deve essere scritto nella riga succesiva.

GNU SED consente anche una sintassi semplificata quando il testo da inserire o aggiungere sta solo su una riga:

Sintassi semplificata per lo standard GNU
i testo da inserire

a testo da aggiungere

Come si può vedere lo standard GNU consente di indicare il testo da inserire o da aggiungere subito dopo il simbolo i od a, senza l'utilizzo del backslash e senza la necessità di scrivere il testo nella riga successiva.

Il funzionamento in dettaglio delle istructions i\ ed a\

La specificità di tali istructions, rispetto a quelle finora viste, deriva dal fatto che non viene alterato in alcun modo il pattern space corrente, in quanto l'esecuzione delle stesse agisce nella fase di invio all'output del testo esistente nel pattern space.

L'esecuzione dell'istruction i\, o dell'istruction a\, nell'ambito del ciclo di esecuzione relativo alla riga caricata nel pattern space, non comporta l'immediato invio in output del testo da inserire o aggiungere: esso è rimandato ad un momento successivo all'interno dello stesso ciclo di esecuzione.

Con l'istruction i\, l'invio allo standard output del testo da inserire avviene immediatamente prima dell'invio allo standard output della riga caricata nel pattern space.

L'invio allo standard output della riga caricata nel pattern space può avvenire per due diverse cause:

Se dopo l'istructions \i è eseguita una istruction per l'invio esplicito allo standard output della riga caricata nel pattern space, prima di tale invio sarà inviato il testo che segue l'istruction \i.

Se, invece, dopo l'esecuzione dell'istruction i\ non ci sono altri script che comportino l'invio esplicito allo standard output della riga nel pattern space, ma è attivo l'invio automatico alla fine del ciclo di esecuzione, prima di questo invio viene inviato il testo collegato all'istruction i\.

Se, in fine, è disattivato anche l'invio automatico, alla fine del ciclo di esecuzione, il testo collegato all'istruction \i viene comunque inviato allo standard output.

Con l'istructions a\, l'invio allo standard output del testo da aggiungere, avviene dopo l'ultimo invio allo standard output della riga caricata nel pattern space.

In pratica se è attivo l'invio automatico allo standard output della riga nel pattern space, il testo da aggiungere viene inviato immediatamente dopo tale invio automatico.

Se l'invio automatico è disattivato, ma esistono altri script che implicano l'esecuzione di una istruction di invio esplicito in output della riga nel pattern space, l'invio del testo da aggiungere avviene immediatamente dopo l'esecuzione dell'ultima istruction di invio esplicto in output del pattern space.

Se, infine, è disattivato l'invio automatico e non vi sono script di invio esplicito della riga caricata nel pattern space, il testo da aggiungere viene in ogni caso inviato allo standard output alla fine del ciclo di esecuzione relativo a quella riga.

Esempio: Inserire e aggiungere testo in fase di output
sed -n -e '{
/^VOX/i\
<inizio modifiche>
/^VOX/a\
<fine modifiche>
s/^VOX/vOX/p
s/^vOX/voX/p
s/^voX/vox/p
/^vox/d
}' myfile.txt