Prima di vedere l'istruction per la sostituzione delle stringhe conviene definire alcuni concetti generali.
La sintassi generale dell'istruction di sostituzione è la segunete:
Il carattere s rappresenta il simbolo dell'istruction di sostituzione.
I caratteri / rappresentono i simboli di delimitazione delle varie parti dell'istructions.
Il pattern serve per individuare quale sia la stringa da sostituire (l'intera riga del pattern space o una qualsiasi sottostringa di essa).
Il replacement rappresenta la sequenza di caratteri che sostituisce la stringa individuata con pattern.
flag sono delle opzioni facoltative che definiscono particolari modalità di ricerca o di sostituzione delle stringhe, oppure particolari modalità di comportamento di SED quando la sostituzione è andata a buon fine.
La scelta del carattere / come delimitatore delle varie parti dell'istruction è convenzionale: il carattere di delimitazione può, quindi, essere cambiato.
Il carattere scelto come delimitatore è quello che compare immediatamente dopo al simbolo s; i delimitatori devono essere necessariamente tre:
Il pattern è un modello regexp; le regular expression consentono di individuare e selezionare delle sottostringhe da una stringa ricevuta come input.
La stringa di input è l'intera riga caricata sul pattern space.
Attraverso il linguaggio simbolico delle regular expression è possibile descrivere un modello con il quale sarà selezionata la sequenza di caratteri da sostituire.
La sequenza di caratteri trovata attraverso il modello
regexp può corrispondere all'intera riga memorizzata nel
pattern space, oppure solo ad una parte di essa, cioè
ad una sottostringa della stringa di input.
Nel primo caso la sostituzone comporterà la modifica
dell'intera riga nel pattern space, la quale sarà
quindi completamente diversa da quella esistente prima
della sostiuzione.
Nel secondo caso invece la
sostituzone riguarderà solo la sequenza di caratteri
parziale corrispondente al modello e quindi la riga nel
pattern space, dopo le sostituzioni, avrà delle parti
modificate e delle parti non modificate.
Quando il modello regexp è progettato per selezionare solo sottostringhe della riga nel pattern space, l'invio allo standard output, dopo la sostituzione delle parti selezionate, coinvolge in ogni caso l'intera riga nel pattern space, comprese le parti non modificate.
Di questo comportamento bisognerà tener conto quando si progetta il pattern dell'istruction s, in quanto, se si ha la necessità di selezionare e sostituire l'intera riga nel pattern space, si dovranno utilizzare il metacarattere ^ e il metacarattere $ per ancorare la corrispondenza all'inizio e alla fine della riga nel pattern space.
Ovviamente se nessuna sottostringa con quelle caratteristiche esiste nel pattern space, nessuna sostituzione sarà effettuata e l'invio allo standard output riguarderà l'intero pattern space (salva la soppressione dell'aoutput automatico).
L'utilizzo dell'istruction s, con il relativo pattern regexp, può convivere con un adress di tipo regexp.
In tal caso, l'azione di ricerca, selezione e sostituzione è operata solo sulle righe del pattern space che, preliminarmente, realizzano una corripondenza con l'adress di tipo regexp dello script che contiene l'istruction s
Quello che è importante capire è la differente funzione dell'adress di tipo regexp rispetto alla regexp del pattern di una istructions di sostituzione.
La regexp di un adress serve per selezionare la riga su cui saranno applicati le istructions collegate al medesimo adress (che possono essere istructions di sostituzione, ma anche istructions di altro tipo).
La regexp di una istructions di sostituzione serve per individuare quale porzione della riga caricata sul pattern space sarà sostituita con la stringa di replacement.
La parte replacement dell'istruzione di sostituzione rappresenta la stringa con cui sostitutuire la sottostringa trovata con il pattern.
In generale i caratteri della stringa di raplacement corrispondono a se stessi, anche se SED mette a disposizione dei metacaratteri che hanno dei significati speciali.
Il metacarattere & corrisponde all'intera sottostringa trovata con il pattern di ricerca.
In pratica SED nella stringa di replacement, al posto del simbolo &, inserisce l'intera sottostringa trovata con il pattern regexp.
Tale metacarattere è utile per realizzare una sostituzione che comporta un inserimento di una stringa arbitraria prima o dopo la stringa trovata con il pattern.
Il metacarattere \N, dove N è una cifra intera, serve per ripetere nella stringa di replacement una porzione della stringa trovata grazie al pattern espressione regolare.
La cifra N indica quale porzione ripetere nella sostituzione.
L'ordine delle porzioni è determinato dall'utilizzo dei metacaratteri di raggruppamento nel pattern regexp di ricerca.
I metacaratteri di raggruppamento sono \( e \) e servono per racchiudere una parte del modello regexp utilizzato per la ricerca; la stringa corrispondente alla parte del modello regexp racchiusa dentro i metacaratteri di raggruppamento è una sottostringa dell'intera stringa trovata dall'intero modello regexp.
Il valore di N, quindi, è scelto in relazione alla posizione nel pattern del reggruppamento a cui si vuole far riferimento.
Con il metacarattere \1 si ripete, nella stringa sostituente del replacement, la sottostringa individuata e selezionata dal primo raggruppamento nel pattern; con il metacarattere \3 si ripete, nella stringa sostituente del replacement, la sottostringa individuata e selezionata dal terzo raggruppamento nel pattern e così via.
Ovviamente se si utilizza il metacarattere \3 nel replacement, nel pattern devono esistere almeno 3 raggruppamenti, cioè tre sequenze di caratteri racchiuse fra i metacaratteri \( e \).
Il metacarattere \L attiva la conversione automatica in minuscolo dei caratteri che formano la stringa di replacement; la conversione automatica riguarda solo i caratteri che si trovano dopo il simbolo \L e non quelli prima; la conversione automatica cessa quando nella stringa di replacement è inserito il metacarattere \E oppure il metacarattere \U.
Il metacarattere \U è speculare al metacarattere \L, soltanto che con esso viene attivata la conversione automatica in maiuscolo.
La conversione automatica, anche in tal caso, cessa quando nlla stringa di replacement viene incontrato il metacarattere \E, oppure il metacarattere \L.
Il metacarattere \E dovrebbe essere ormai chiaro, esso disattiva la conversione automatica, in minuscolo o in maiuscolo, in precedenza attivata con il metacarattere \L oppure \U.
Il metacarattere \l sta ad indicare che il carattere successivo, nella stringa di replacement, deve essere in ogni caso convertito in minuscolo; la conversione riguarda solo un carattere, cioè quello che immediatamente segue il metacarattere \l.
Il simbolo \u è speculare al simbolo \l, con l'unica differenza che il successivo carattere sarà convertito in maiuscolo.
Altra questione collegata al rplacement
dell'istruction s, attiene al modo in cui si possono
inserire caratteri di newline nella stringa che
sostitiuisce quella trovata con il pattern.
Anche in tal caso entra in gioco il simbolo \.
Gli script che seguono nei due successivi esempi sono alternativi ed hanno come scopo quello di inserire un newline dopo un carattere . che conclude una frase della riga caricata nel pattern space; si può dire che un . conclude una frase quando dopo di esso vi siano 0 o più caratteri di spaziatura e successivamente una lettera maiuscola qualsiasi (lo spazio e la lettera maiuscola dopo il punto, sono presi come indice del fatto che sulla medesima riga riprende una frase diversa, che noi invece vogliamo portare sulla riga successiva inserendo un newline).
Quest'ultimo modo di inserire il newline è funzionante per GNU SED, ma non è detto che sia funzionante per i programmi SED non GNU.
I flag sono tutti facoltativi e definiscono particolari modalità di ricerca o di sostituzione delle stringhe, oppure particolari modalità di comportamento di SED quando la sostituzione è andata a buon fine.
Per capire la funzione dei flag g ed N (N valore numerico) è necessario fare una premessa su come SED esegue la ricerca e la sostituzione sulla riga caricata nel pattern space.
Il modello regexp del pattern serve a ricercare una sottostringa della riga caricata nel pattern space; tale sottostringa viene sostituita con la stringa di replacement.
Non è infrequente che la sottostringa corrispondente al modello di ricerca esiste più volte sulla riga caricata nel pattern space.
Se si ha l'esigenza di sostituire tutte le sottostringhe corrispondenti al modello di ricerca è necessario utilizzare il flag g.
Se, invece, si vuole sostituire solo una specifca corrispondenza esistente sulla riga caricata nel pattern space, ad esempio solo la seconda o solo la terza, si potrà utilizzare un valore numerico N.
Il valore numerico N consente di specificare quale corrispondenza, se esiste, deve essere sostituita con la stringa di replacement.
I flag p e w definiscono un azione supplementare che SED dovrà eseguire nel caso in cui la sostituzione di stringa vada a buon fine.
Il flag p invia sullo standard output la riga caricata nel pattern space se ed in quanto le sostituzioni sono state effettuate.
Se l'invio automatico allo standard output non è stato
disabilitato, la riga caricata nel pattern space viene
in ogni caso stampata
, nel senso che sarà mandata in
output anche se su di essa non è stata eseguita alcuna
sostituzione; se invece le sostituzione sono state
eseguite, la riga nel pattern space viene stampata
due volte.
Il flag w scrive su un file le righe caricate nel pattern space, se ed in quanto le sostituzioni sono state effettuate; se nessuna sostituzione è effettuata, perchè non c'è una sottostringa corrisponde all'adress dello script, oppure sulla riga non vi è una corrispondenza con il pattern dell'istruction s, quella riga non sarà scritta sul file.
Il path completo del file su cui scrivere le righe viene indicato dopo il simbolo w, separato da uno spazio; se il file esiste già esso viene sovrascritto, se non esiste viene creato ex novo.
Da questo esempio si può anche notare che i flag di una istruction di sostituzione possono essere più di uno ed in tal caso essi vanno indicati uno di seguito all'altro, senza separarli con spazi.
Il flag i rende la ricerca delle corrispondenze case insensitive.
Infatti, di default, lettere maiuscole e lettere minuscole sono da considerare come caratteri diversi; con il flag i, SED assume l'uguaglianza fra una lettera in minuscolo e la stessa lettera in maiuscolo.
É nececessario precisare che il flag i agisce solo sulle ricerche collegate al pattern dell'istruction s, e non anche sulle ricerche collegate agli adress di tipo regexp
Il flag e fa si che la riga nel pattern space, così come risultante dopo le sostituzioni di stringa, sia considerata da SED come un comando eseguibile dalla shell predefinita del sistema (normalmente Bash).
In pratica, eseguite le sostituzioni, SED invia la riga esistente nel pattern space alla shell Bash, che considera l'input ricevuto da SED come un comando esguibile.
Lo standard output di Bash è automaticamente rediretto a SED, cosicché i risultati dell'esecuzione del comando sono memorizzati nel pattern space al posto del suo contenuto originario.
Se l'input passato da SED a Bash non è un comando eseguibile, Bash reagirà con un messaggio di errore, che, normalmente, è inviato sullo standard error; lo standard error, non è rediretto su SED e quindi i messaggi di errore non saranno memorizzati nel pattern space.
É il caso di ricordare che, qualora dopo l'istructions di sostituzione con il flag e ci siano altre istructions da applicare sul medesimo pattern space, queste agiranno sulla sequenza di caratteri restituita da Bash come risultato dell'esecuzione del comando.
Il flag m agisce sul modo in cui i metacaratteri ^ e $ eventualmente contenuti nel pattern sono valutati, qualora l'istruction s agisca su un pattern space multiriga.
Per una spiegazione più dettagliata del funzionamento del flag m, si rimanda alla sezione che tratta dei pattern space multi riga (Ancora non completata).