GUIDA A SED, 00 – fondamenti

Fondamenti

 

Fonte:
http://www.pluto.it/files/ildp/guide/abs/sedawk.html

Mentre awk è un vero e proprio linguaggio di programmazione per l’elaborazione di file di testo strutturati orientato ai campi e con una sintassi simile a quella del C, sed è un editor non interattivo di file di testo.
Nonostante le loro differenze, le due utility condividono una sintassi d’invocazione simile, entrambe fanno uso delle Espressioni Regolari, entrambe leggono l’input, in modo predefinito, dallo stdin ed entrambe inviano i risultati allo stdout. Sono strumenti UNIX ben collaudati e funzionano bene insieme. L’output dell’una può essere collegato, per mezzo di una pipe, all’altra e le loro capacità combinate danno agli script di shell parte della potenza di Perl.

Sed è un editor di riga non interattivo. Riceve un testo come input, o dallo stdin o da un file, esegue alcune operazioni sulle righe specificate, una alla volta, quindi invia il risultato allo stdout o in un file. Negli script di shell, sed è, di solito, una delle molte componenti di una pipe.

Sed determina le righe dell’input, su cui deve operare, tramite un indirizzo che gli è stato passato. Questo indirizzo può essere rappresentato sia da un numero di riga sia da una verifica d’occorrenza.
Ad esempio, “3d” indica a sed di cancellare la terza riga dell’input, mentre “/windows/d” segnala a sed che si vogliono cancellare tutte le righe dell’input contenenti l’occorrenza “windows”.

Sintassi:

sed [opzioni] comando_di_editing [file]

Il formato per i comandi di editing è:

[indirizzo1[,indirizzo2]] [funzione] [argomenti]
Operatori di base di sed:

[indirizzo]/p -> print Visualizza [l’indirizzo specificato]

[indirizzo]/d -> delete Cancella [l’indirizzo specificato]

s/modello1/modello2/ -> substitute Sostituisce in ogni riga la prima occorrenza della stringa modello1 con la stringa modello2

[indirizzo]/s/modello1/modello2/-> substitute Sostituisce, in tutte le righe specificate in indirizzo, la prima occorrenza della stringa modello1 con la stringa modello2

[indirizzo]/y/modello1/modello2/-> transform sostituisce tutti i caratteri della stringa modello1 con i corrispondenti caratteri della stringa modello2, in tutte le righe specificate da indirizzo (equivalente di tr)

g -> global Agisce su tutte le verifiche d’occorrenza di ogni riga di input controllata

q -> quit Esci quanto viene matchato un pattern

Esempi di operatori sed:

8d -> Cancella l’ottava riga dell’input.
/^$/d -> Cancella tutte le righe vuote.
1,/^$/d -> Cancella dall’inizio dell’input fino alla prima riga vuota compresa.
/Jones/p -> Visualizza solo le righe in cui è presente “Jones” (con l’opzione -n).
s/Windows/Linux/ -> Sostituisce con “Linux” la prima occorrenza di “Windows” trovata in ogni riga dell’input.
s/BSOD/stabilità/g -> Sostituisce con “stabilità” tutte le occorrenze di “BSOD” trovate in ogni riga dell’input.
s/ *$// -> Cancella tutti gli spazi che si trovano alla fine di ogni riga.
s/00*/0/g -> Riduce ogni sequenza consecutiva di zeri ad un unico zero.
/GUI/d -> Cancella tutte le righe in cui è presente “GUI”.
s/GUI//g -> Cancella tutte le occorrenze di “GUI”, lasciando inalterata la parte restante di ciascuna riga.

Alcune valide flag per le funzioni sostitutive sono:

Le opzioni:
-e -> (edit) indica che la stringa successiva deve essere interpretata come un’istruzione di editing, quindi se viene passata un’unica istruzione il “-e” può essere omesso
-e script script di editing

-n -> indica a sed di visualizzare solo quelle righe che verificano il modello, altrimenti verrebbero visualizzate tutte le righe dell’input. In pratica non stampa l’output di default, ma solamente quelle linee specificate dalle funzioni p o s///p

-i -> indica a sed di operare direttamente sul file sorgente (edit the file “in-place”)
Il quoting forte (”) protegge i caratteri speciali delle espressioni regolari presenti nell’istruzione, dalla reinterpretazione da parte dello script. Questo riserva solo a sed l’espansione delle espressioni regolari.

La barra inversa costringe il comando di sostituzione sed a continuare sulla riga successiva. L’effetto è quello di usare il carattere di a capo alla fine della prima riga come stringa di sostituzione.

s/^ */\
/g

In questo modo, tutti gli spazi che si trovano all’inizio della riga vengono sostituiti con un carattere di a capo. Il risultato finale è la sostituzione di tutte le indentazioni dei paragrafi con righe vuote poste tra gli stessi paragrafi.

Un indirizzo seguito da una, o più, operazioni può richiedere l’impiego della parentesi graffa aperta e chiusa, con un uso appropriato dei caratteri di a capo.

/[0-9A-Za-z]/,/^$/{
/^$/d
}
Questo cancella solo la prima di ogni serie di righe vuote. Potrebbe essere utile per effettuare la spaziatura singola di un file di testo mantenendo, però, la/e riga/he vuota/e tra i paragrafi.

Esempi:

Questo esempio modifica tutte le accidentali virgole (,) in una virgola seguita da uno spazio (, ) quindi crea l’output:

% cat filey | sed s/,/,\ /g

Il seguente esempio rimuove tutte le accidentali Jr precedute da uno spazio (Jr) all’interno del file filey:

% cat filey | sed s/\ Jr//g

Per realizzare operazioni multiple sull’input, si precede ogni operazione con l’opzione -e (edit) e si quota la stringa. Ad esempio, per filtrare le linee contenenti «Date: » e «From: » e rimpiazzarle senza i due punti (:):

% sed -e ‘s/Date: /Date /’ -e ‘s/From: /From /’

Per visualizzare solamente le linee del file che iniziano con «Date:» e includerne una che inizia con «Name:»:

% sed -n ‘/^Date:/,/^Name:/p’

Per stampare solamente le prime 10 linee dell’input (un rimpiazzo di “head”):

% sed -n 1,10p

———————————————-

 INDICE

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>