Successivo: Espressioni regolari, Precedente: Ciclo di esecuzione, Su: Programmi di sed [Contenuti][Indice]
sed
Gli indirizzi in uno script di sed
possono essere in una delle
seguenti forme:
numero
Specificando 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~passo
Questa 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%I
Il 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%M
Il 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%S
Il 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%X
Il 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,+N
Trova indir1 e le N righe che seguono indir1.
indir1,~N
Trova 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]