Successivo: , Precedente: , Su: Programmi di sed   [Contenuti][Indice]


3.5 Il comando s

La sintassi del comando s (come l’iniziale di “sostituire”) è ‘s/regexp/rimpiazzo/parametri’. I caratteri / possono essere sostituiti sistematicamente con ogni altro carattere all’interno di ogni comando s dato. Il carattere / (o qualsiasi altro carattere venga usato al suo posto) può apparire in regexp o in rimpiazzo solo se preceduto (protetto) da un carattere \.

Il comando s è probabilmente quello più importante di sed e ha molte opzioni diverse. Il concetto base è semplice: il comando s confronta il pattern space con la regexp fornita; se il confronto ha esito positivo, quella parte del pattern space che corrisponde all’espressione regolare è sostituita con rimpiazzo.

Il rimpiazzo può contenere \n riferimenti (dove n è un numero da 1 a 9, inclusi), che designa la porzione della corrispondenza contenuta fra la n-esima \( e la \) ad essa appaiata. Inoltre, il rimpiazzo può contenere caratteri & non protetti che si riferiscono all’intera porzione trovata del pattern space. Infine, come estensione GNU sed, si può includere una sequenza speciale costituita da una barra inversa e da una delle lettere L, l, U, u ed E. Il significato è il seguente:

\L

Converte il rimpiazzo in minuscolo finché non viene trovato \U o \E,

\l

Converte in minuscolo il carattere successivo,

\U

Converte il rimpiazzo in maiuscolo finché non viene trovato \L o \E,

\u

Converte in maiuscolo il carattere successivo,

\E

Termina la conversione iniziata da \L o \U.

Quando è in uso il parametro g, la conversione maiuscolo/minuscolo non si propaga da un’occorrenza dell’espressione regolare all’altra. Per esempio, quando il seguente comando viene eseguito con ‘a-b-’ nel pattern space:

s/\(b\?\)-/x\u\1/g

il testo risultante è ‘axxB’. Quando si rimpiazza la prima ‘-’, la sequenza ‘\u’ ha effetto solo sul rimpiazzo vuoto ‘\1’. Non ha effetto sul carattere x che è aggiunto al pattern space quando si rimpiazza b- con xB.

D’altra parte, \l e \u hanno effetto sul resto del rimpiazzo del testo se sono seguiti da una sostituzione vuota. Con ‘a-b-’ nel pattern space, il seguente comando:

s/\(b\?\)-/\u\1x/g

rimpiazzerà ‘-’ con ‘X’ (maiuscolo) e ‘b-’ con ‘Bx’. Se questo comportamento non è gradito, è possibile prevenirlo aggiungendo una sequenza di ‘\E’ (in questo caso dopo ‘\1’).

Per includere un \, un & o un newline letterali nel rimpiazzo finale, assicurarsi di far precedere \, &, o newline nel rimpiazzo con un \.

Il comando s può essere seguito da uno o più dei seguenti parametri:

g

Applica la sostituzione a tutte le corrispondenze della regexp, non solo alla prima.

numero

Sostituisce solo la numero-esima corrispondenza di regexp.

Nota: lo standard POSIX non specifica cosa dovrebbe accadere quando si combinano i modificatori g e numero, e attualmente non c’è una regola generalmente accettata tra le varie implementazioni di sed. Per GNU sed, l’interazione è definita come: ignorare le corrispondenze prima della numero-esima, e poi individuare e rimpiazzare tutte le corrispondenze dalla numero-esima in poi.

p

Se la sostituzione è stata effettuata, stampa il nuovo pattern space.

Nota: quando vengono specificate entrambe le opzioni p ed e, l’ordinamento relativo dei due produce risultati diversi. Ciò che generalmente viene richiesto è ep (prima valuta poi stampa), però operare con l’ordinamento inverso può essere utile per eseguire il debug. Per questo motivo la versione corrente di GNU sed interpreta in modo diverso la presenza dell’opzione p prima e dopo e, stampando il pattern space prima e dopo la valutazione, mentre in generale i flag del comando s hanno effetto solo una volta. Questo comportamento, benché documentato, potrebbe cambiare nelle versioni future.

w nome-file

Se è stata fatta la sostituzione, scrive il risultato nel file indicato. Come estensione GNU sed, sono supportati due valori speciali di nome-file: /dev/stderr, che scrive il risultato sullo standard error, e /dev/stdout, che scrive sullo standard output.4

e

Questo comando consente di immettere nel pattern space del testo prodotto da un comando di shell, usando una “pipe”. Se è stata fatta una sostituzione, il comando presente nel pattern space viene eseguito e il pattern space è sostituito col suo output. Il newline finale viene soppresso; i risultati sono indefiniti se il comando da eseguire contiene un carattere NUL. Questa è un’estensione GNU sed.

I
i

Il modificatore I è un’estensione GNU col quale sed ricerca corrispondenze tramite le regexp senza far distinzione fra lettere maiuscole e minuscole.

M
m

Il modificatore M è un’estensione GNU sed che chiede a GNU sed di ricercare corrispondenze con l’espressione regolare in modalità multi-riga. Il modificatore fa sì che ^ e $ corrispondano rispettivamente (in aggiunta al normale comportamento) alla stringa vuota dopo un newline, e alla stringa vuota prima di un newline. Ci sono sequenze di caratteri speciali (\A e \Z in modalità Perl, \` e \' nelle modalità basic o estesa delle espressioni regolari) che corrispondono sempre all’inizio o alla fine dell’area transitoria (buffer). In aggiunta, proprio come nella modalità Perl senza il modificatore S, il punto non corrisponde al carattere di new-line in modalità multi-riga.

S
s

Il modificatore S del criterio di ricerca delle espressioni regolari vale solo in modalità Perl e specifica che il carattere punto (.) corrisponde anche al carattere newline. S sta per singola-riga.

X
x

Il modificatore X del criterio di ricerca delle espressioni regolari è pure valido solo in modalità Perl. Se lo si usa, il carattere spazio nell’espressione regolare (tranne nella designazione di una classe di caratteri) e i caratteri tra un # all’esterno di una classe di caratteri e il successivo carattere newline sono ignorati. Una barra inversa di protezione può essere usata per includere uno spazio bianco o un carattere # come parte dell’espressione regolare.


Note a piè di pagina

(4)

Questo è equivalente a p a meno che non si usi l’opzione -i.


Successivo: , Precedente: , Su: Programmi di sed   [Contenuti][Indice]