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


3.2 Selezionare righe con 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: , Precedente: , Su: Programmi di sed   [Contenuti][Indice]