Introduzione all'uso di sed

Andare in basso

Introduzione all'uso di sed

Messaggio Da floatman il Mer Set 16, 2009 12:31 pm

Sed sta per Stream EDitor (editor in linea) ed infatti ha la struttura di un editor di testo, con caratteristiche estremamente particolari:
- filtra l'input di un file (o un pipe).
- Non richiede l'editing dell'utente (non esiste "Apri con sed" e "Salva").
- La sua sintassi non definisce un out-put.
- L'input di default non viene modificato.
Lette queste caratteristiche, sembrerebbe che sed sia un'applicazione totalmente inutile; nella realtà è fondamentale nella trattazione di file di testo in maniera automatica.
Iniziamo creando un file di esempio con un po' di righe...
Codice:
$ echo -e "Questa e' la prima riga\nquesta e' la seconda\nquesta (terza) la chiamo Pippo\nquesta e' la quarta\nquesta (quinta) si chiama Pluto\nquesta (sesta) e' l'ultima" > prova
Il risultato credo sia intuibile...
Codice:
$ cat prova
Questa e' la prima riga
questa e' la seconda
questa (terza) la chiamo Pippo
questa e' la quarta
questa (quinta) si chiama Pluto
questa (sesta) e' l'ultima
Come si è visto all'inizio, sed è molto particolare, infatti se dessi il comando "sed prova" visualizzarei un errore.
La sintassi di sed è la seguente:

sed [opzioni] [script-usato] [input]

cioè sed si aspetta un qualche script racchiuso tra apici e se non viene dato, prova a leggerlo dall'input. Infatti...
Codice:
$ sed prova
sed: espressione -e #1, carattere 2: ci sono altri caratteri dopo il comando
l'apice dopo la "e" viene considerato l'inizio script, che ovviamente non ha nè lettura nè fine.

Trucchetto inutile: si può imbrogliare? Certo...basta mandarlo "a vuoto"...

$ sed '' prova
Questa e' la prima riga
questa e' la seconda
questa (terza) la chiamo Pippo
questa e' la quarta
questa (quinta) si chiama Pluto
questa (sesta) e' l'ultima

molto inutile xD


Cosa possiamo fare con questi script per sed?
Possiamo trattare il nostro file tramite le comuni espressioni regolari (regexp), cercare qualcosa in un file oppure fare sostituzioni.

Quando sed cerca un'espressione, produce in output le righe dell'input e quindi la riga con l'espressione, cosa che può risultare poco piacevole...
Codice:
$ sed '/questa/p' prova
Questa e' la prima riga
questa e' la seconda
questa e' la seconda
questa (terza) la chiamo Pippo
questa (terza) la chiamo Pippo
questa e' la quarta
questa e' la quarta
questa (quinta) si chiama Pluto
questa (quinta) si chiama Pluto
questa (sesta) e' l'ultima
questa (sesta) e' l'ultima
"p" sta per "print"; il sistema per ovviare a questo inconveniente è l'utilizzo dell'opzione "-n"
Codice:
$ sed -n '/questa/p' prova
questa e' la seconda
questa (terza) la chiamo Pippo
questa e' la quarta
questa (quinta) si chiama Pluto
questa (sesta) e' l'ultima
...già meglio xD

Ad esempio possiamo suddividere il file "prova" in due file "prova1" e "prova2" di tre righe ciascuno.
Codice:
$ sed -n '1,3p' prova
Questa e' la prima riga
questa e' la seconda
questa (terza) la chiamo Pippo

$ sed -n '4,6p' prova
questa e' la quarta
questa (quinta) si chiama Pluto
questa (sesta) e' l'ultima
Nel primo file abbiamo stampato le prime tre righe, nel secondo le ultime tre.
E' da notare come avremmo potuto avere lo stesso risultato con le espressioni regolari:
$ sed -n '^,3p' prova
$ sed -n '4,$p' prova

"^" indica l'inizio del file, "$" la fine.

Le sostituzioni sono la caratteristica più usata di sed, che ovviamente legge il contenuto del file tramite un insieme di regexp.
Ad esempio il mio file di prova andrebbe scritto un po' più correttamente, con il punto a fine riga e la "Q" su "questa"...
Codice:
$ sed -e 's/$/./g' -e 's/questa/Questa/g' prova
Questa e' la prima riga.
Questa e' la seconda.
Questa (terza) la chiamo Pippo.
Questa e' la quarta.
Questa (quinta) si chiama Pluto.
Questa (sesta) e' l'ultima.
-e (expression) ci permette di dichiarare le espressioni regolari all'interno degli apici successivi, come si vede si possono utilizzare più espressioni.
All'interno degli apici, "s" sta per "substitution" e la "g" finale sta per "global", il simbolo "$" lo conosciamo ^^

Questo è ovviamente uno sguardo iniziale molto superficiale all'uso di sed, per approfondimenti il solito "man sed" può darvi ulteriori delucidazioni. Ovviamente è importante l'utilizzo congiunto di sed con altre utili applicazioni (awk ad esempio...)

Per concludere, un semplice e simpatico esempio:
Codice:
$ echo -e "<html>\n<head></head>\n<body>" > prova.html
$ sed -e 's/^/\t<br>/g' prova >> prova.html
$ echo -e "</body>\n</html>" >> prova.html
$ cat prova.html
<html>
<head></head>
<body>
   <br>Questa e' la prima riga
   <br>questa e' la seconda
   <br>questa (terza) la chiamo Pippo
   <br>questa e' la quarta
   <br>questa (quinta) si chiama Pluto
   <br>questa (sesta) e' l'ultima
</body>
</html>
Buon divertimento ^^
avatar
floatman

Messaggi : 844
Data d'iscrizione : 14.09.09

Visualizza il profilo dell'utente http://myville.altervista.org

Tornare in alto Andare in basso

Tornare in alto

- Argomenti simili

 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum