Magazine Tecnologia

HowTo: qualcosa con SED

Creato il 17 marzo 2011 da Idl3

L’uso del terminale si rivela un ottimo alleato nel caso in cui vogliamo eseguire operazioni semplici ma che richiederebbero troppo tempo se fatte “a mano”. Diamo il comando e lasciamo sia lui a fare tutto. SED (stream editor) e’ un ottimo esempio di questa situazione. Si tratta, come dice il nome, di uno stream editor, un editor non interattivo.

HowTo: qualcosa con SED

Stream editor? Non interattivo? Bruce Barnett nel suo “Sed – An Introduction and Tutorial” descrive SED come:

“a stream flowing through a pipe. Okay, you can’t see a stream if it’s inside a pipe.”

ma vederlo in azione vale piu’ di mille tortuose spiegazioni.

Diamo in pasto a SED del testo, o tramite un file di testo oppure come input standard (stdin), e a seconda delle opzioni e comandi che gli abbiamo dato SED eseguira’ alcune operazioni sul testo, una riga alla volta, inviando poi il risultato all’output standard (stdout) o a un file. Di solito SED viene utilizzato assieme ad altri comandi in una pipe, ad esempio se lo uso con echo sostituendo l’output di echo con un altro:
$ echo difficile | sed s/difficile/facile/
senza SED il comando sopra (echo difficile) ci avrebbe restituito “difficile“, con SED invece l’input “difficile” viene trasformato nell’output “facile“.

Come avete visto nell’esempio, a SED era accompagnata una s che precedeva le due parole (difficile e facile), quella s sta’ per substitute, altre operazioni principali sono p (print) e d (delete).

Possiamo far precedere questi comandi da un indirizzo, oppure no (in questo secondo caso SED applica l’operazione a tutte le righe del testo). Ecco una estrema sintesi:
[indirizzo]/p mostra [indirizzo];
[indirizzo]/d cancella [indirizzo];
s/cosa1/cosa2/ sostituisce cosa1 con cosa2 in ogni riga (se non mettiamo g viene sostituita solo la prima occorrenza di ogni riga);
[indirizzo]/s/cosa1/cosa2/ sostituisce cosa1 con cosa2 in [indirizzo].
Poi abbiamo g (global) che dice a SED di operare su tutte le verifiche d’occorrenza di ogni riga di input. Ad esempio se dobbiamo sostituire all’interno del file ante-1861.txt la parola Sardegna con la parola Italia e riportare il tutto nel file post-1861.txt, diamo il seguente comando:
$ sed 's/Sardegna/Italia/g' ante-1861.txt > post-1861.txt

Vediamo un uso semplice ma concreto di SED. Mettiamo il caso che abbiate un sito costituito di pagine HTML statiche e in queste pagine anziche’ inserire degli indirizzi interni relativi (ad es. ../../pagina.html), abbiate usato i collegamenti assoluti (ad es. http://www.sito.ext/directory/subdirectory/pagina.html). Cosa fate se dovete trasferire tutte le pagine da www.sito.ext a www.altrosito.ext/sito/? Il problema e’ che dovete sostituire in ogni pagina i riferimenti a sito.ext con altrosito.ext/sito.

Due son le cose, o vi armate di un esercito di scimmie instancabili, o usate SED. Scartata la prima opzione per cause di forza maggiore (le scimmie sono impegnate a cercare di scrivere un libro), dovete dire a SED di prendere tutti i file con estensione html contenuti nella directory corrente e sostituire al loro interno sito.ext con altrosito.ext/sito. Essendoci gli slash e i punti, dovete indicare a SED quando si tratta di quelli relativi ai termini e quando invece sono relativi alle operazioni.

Ci sono vari modi per fare questo, possiamo ad esempio usare le backslash [barre rovesciate (\)] per quotare le slash [barre (/)] che e’ il piu’ incasinato, viene giustamente chiamato picket fence, e se guardate questo esempio ne capite il motivo:
$ sed 's/\/usr\/local\/bin/\/common\/bin/' new
Possiamo usare l’underscore [trattino basso (_)]:
$ sed 's_/usr/local/bin_/common/bin_' new
o i due punti (:):
$ sed 's:/usr/local/bin:/common/bin:' new
Attenti che in certi casi (non in questo) SED richiede il quoting () al posto degli apici singoli ().

Torniamo al nostro esempio. Ecco come si presenta il comando usando la barra rovesciata per quotare le barre e gli altri segni “equivoci“:
$ sed -i 's/www\.sito\.ext/www\.altrosito\.ext\/sito/g' *.html

Ecco fatto, come al solito andatevi a leggere il manuale:
$ man sed
e date un’occhiata agli approfondimenti (sul serio, fatelo).

Approfondimenti:

Foto: SED – Stream editor


[^] torna su | post<li> | HowTo: qualcosa con SED | Flattr this!


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :

Dossier Paperblog

Magazine