Successivo: Espressioni regolari, Precedente: Ciclo di esecuzione, Su: Programmi di sed [Contenuti][Indice]
sedGli indirizzi in uno script di sed possono essere in una delle
seguenti forme:
numeroSpecificando un numero di riga si seleziona solo quella nell’input.
(da notare che sed conta le righe in modo continuo attraverso
tutti i file in input, se non vengano specificate le opzioni
-i o -s).
prima_riga~passoQuesta estensione GNU cerca corrispondenze ogni passo righe
a partire dalla riga prima_riga.
In particolare, le righe selezionate sono quelle per le quali esiste
un numero n non negativo tale che il numero di riga corrente eguagli
prima_riga + (n * passo).
Così, per selezionare le righe dispari si userà 1~2;
per scegliere ogni terza riga a partire dalla seconda, ‘2~3’;
per scegliere ogni quinta riga a partire dalla decima, ‘10~5’;
e ‘50~0’ è solo un modo incomprensibile per dire "solo la riga 50".
$Questo indirizzo seleziona l’ultima riga dell’ultimo file in input, o l’ultima riga di ogni file se sono state specificate le opzioni -i o -s.
/regexp/Seleziona qualsiasi riga che corrisponde all’espressione regolare regexp.
Se regexp stesso contiene qualche carattere /, ognuno di essi
dev’essere protetto da una barra inversa (\).
L’espressione regolare vuota ‘//’ chiede di usare l’ultima corrispondenza
di espressione regolare (la stessa cosa avviene se l’espressione
regolare vuota viene passata al comando s). Da notare che i
modificatori delle espressioni regolari sono valutati quando l’espressione
regolare viene compilata, perciò non è valido specificarli assieme
all’espressione regolare vuota.
\%regexp%(Il % può essere sostituito da qualunque altro carattere singolo)
Anche qui si usa un’espressione regolare regexp, ma è permesso
usare un delimitatore diverso da /. Ciò è particolarmente utile se
la stessa regexp contiene diverse barre oblique, poiché evita la
seccatura di dover proteggere ogni /. Se la stessa regexp
contiene caratteri di delimitazione, ognuno di essi va protetto con una barra
inversa (\).
/regexp/I\%regexp%IIl modificatore I del criterio di ricerca dell’espressione regolare è
un’estensione GNU che fa sì che regexp trovi corrispondenze
senza far distinzione tra lettere maiuscole e minuscole.
/regexp/M\%regexp%MIl modificatore M del criterio di ricerca
è un’estensione di GNU sed che chiede a GNU sed di considerare
espressioni regolari multi-riga, che oltrepassano il limite di una riga.
Il modificatore fa sì che ^ e $ corrispondano rispettivamente
(in aggiunta al comportamento normale) 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à di base o estesa delle espressioni regolari)
che corrispondono sempre all’inizio o alla fine del buffer.
In aggiunta,
analogamente alla modalità Perl senza il modificatore S,
il punto non individua il carattere newline in modalità
multi-riga.
/regexp/S\%regexp%SIl modificatore S del criterio di ricerca è valido solo
in modalità Perl e specifica che il carattere “punto” (.) individua
anche il carattere di “newline”. S sta per singola-riga.
/regexp/X\%regexp%XIl modificatore X del criterio di ricerca è anch’esso
valido solo in modalità Perl. Se usato, gli spazi nell’espressione
regolare (tranne che in una classe carattere) e
i caratteri tra un # all’esterno di una classe carattere e il successivo
carattere newline sono ignorati. Una barra inversa di protezione
può essere usata per includere un carattere spazio o un # come
parte dell’espressione regolare.
Se non è presente alcun indirizzo, le corrispondenze vengono cercate su tutte le righe; se viene fornito un indirizzo, vengono individuate solo le righe che corrispondono a quell’indirizzo.
Un intervallo di indirizzi può essere definito specificando due indirizzi
separati da una virgola (,). Un intervallo di indirizzi corrisponde
a ogni riga a partire dal primo indirizzo trovato,
fino a giungere a quella che corrisponde al secondo indirizzo (incluso).
Se il secondo indirizzo è una regexp, il controllo della fine della corrispondenza inizia dalla riga che segue la riga che corrisponde al primo indirizzo: un intervallo abbraccia sempre almeno due righe (tranne, naturalmente, il caso in cui il flusso in input finisce).
Se il secondo indirizzo è un numero minore o uguale a quello della riga corrispondente al primo indirizzo, viene confrontata solo questa prima riga.
GNU sed supporta anche alcune forme “a due indirizzi” speciali, che
sono tutte estensioni GNU:
0,/regexp/Un numero di riga 0 può essere usato in una specificazione di
indirizzo del tipo 0,/regexp/ in modo che sed
cerchi corrispondenze di regexp anche nella prima riga in input.
In altre parole, 0,/regexp/ è simile a 1,/regexp/,
con la differenza che, se indir2 trova una corrispondenza proprio nella
prima riga, la forma 0,/regexp/ la considera come fine
dell’intervallo, mentre la forma 1,/regexp/ la considera
come l’inizio di quest’intervallo e quindi si estende fino all’occorrenza
della seconda espressione regolare.
Si noti che questa è l’unica situazione in cui l’indirizzo 0 ha
significato; non c’è nessuna 0-esima riga e i comandi che hanno dato
l’indirizzo 0 in qualsiasi altro modo daranno luogo a un errore.
indir1,+NTrova indir1 e le N righe che seguono indir1.
indir1,~NTrova indir1 e le righe successive a indir1 fino alla prossima riga il cui numero di riga è un multiplo di N.
Il carattere ! alla fine di una definizione di
indirizzo inverte la selezione.
Cioè, se il carattere ! è alla fine di un intervallo di
indirizzi, verranno selezionate solo le righe che non appartengono a
quell’intervallo.
Questo vale anche per gli indirizzi singoli
e, forse diabolicamente, per l’indirizzo nullo.
Successivo: Espressioni regolari, Precedente: Ciclo di esecuzione, Su: Programmi di sed [Contenuti][Indice]